http://acm.hdu.edu.cn/showproblem.php?pid=3699
2 A A A BCD BCD B
5 72
题意很简单,都不知道咋描述。。
就是爆搜下,注意下前导0以及除法别直接除。。
/**
* @author neko01
*/
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <cstdio>
#include <cstring>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cmath>
#include <set>
#include <map>
using namespace std;
typedef long long LL;
#define min3(a,b,c) min(a,min(b,c))
#define max3(a,b,c) max(a,max(b,c))
#define pb push_back
#define mp(a,b) make_pair(a,b)
#define clr(a) memset(a,0,sizeof a)
#define clr1(a) memset(a,-1,sizeof a)
#define dbg(a) printf("%d\n",a)
typedef pair<int,int> pp;
const double eps=1e-8;
const double pi=acos(-1.0);
const int INF=0x7fffffff;
const LL inf=(((LL)1)<<61)+5;
map<char,int>mp;
char s[3][10];
int val[3][10];
int a[10];
bool vis[10];
int ans;
int gao(int x)
{
int ans=0,len=strlen(s[x]);
for(int i=0;i<len;i++)
ans=ans*10+a[val[x][i]];
return ans;
}
void dfs(int step)
{
if(step==0)
{
if(a[val[0][0]]==0&&strlen(s[0])>1)
return;
if(a[val[1][0]]==0&&strlen(s[1])>1)
return;
if(a[val[2][0]]==0&&strlen(s[2])>1)
return;
int x=gao(0),y=gao(1),z=gao(2);
if(x+y==z) ans++;
if(x-y==z) ans++;
if((LL)x*(LL)y==z) ans++;
if(y!=0&&(LL)z*(LL)y==x) ans++;
return;
}
for(int i=0;i<10;i++)
{
if(!vis[i])
{
vis[i]=true;
a[step]=i;
dfs(step-1);
vis[i]=false;
}
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
clr(vis);
mp.clear();
clr(val);
int num=1;
ans=0;
for(int i=0;i<3;i++)
{
scanf("%s",s[i]);
int len=strlen(s[i]);
for(int j=0;j<len;j++)
{
if(mp[s[i][j]]==0)
{
mp[s[i][j]]=num++;
val[i][j]=mp[s[i][j]];
}
else val[i][j]=mp[s[i][j]];
}
}
dfs(num-1);
printf("%d\n",ans);
}
return 0;
}
hdu3699 A hard Aoshu Problem 暴搜
原文:http://blog.csdn.net/neko01/article/details/40753151