POJ 3989 A hard Aoshu Problem

题目连接:http://poj.org/problem?id=3989

题意:给3个字符串,求每个字母匹配一个数字之后成立的等式的个数。S2,S3之间为等号,S1,S2之间可为任意运算符号(+,-,*,/)。

分析:一开是给想复杂了...结果一看范围我崩溃,爆搜秒之。

 

附代码:

View Code
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
bool v[6];
bool visit[10];
int t[6];
int a[6],b[6],c[6];
int lena,lenb,lenc;
int ans;
int check()
{
int x=0,y=0,z=0,tans=0;
if (lena>0 && t[a[0]]==0) return 0;
if (lenb>0 && t[b[0]]==0)return 0;
if (lenc>0 && t[c[0]]==0) return 0;
for (int i=0;i<=lena;i++)
x=x*10+t[a[i]];
for (int i=0;i<=lenb;i++)
y=y*10+t[b[i]];
for (int i=0;i<=lenc;i++)
z=z*10+t[c[i]];
if (x+y==z) tans++;
if (x-y==z) tans++;
if (x*y==z) tans++;
if (y!=0) if (x/y==z && x%y==0) tans++;
return tans;
}
void dfs(int d)
{
if (d==5)
{
ans+=check();
return;
}
if (v[d])
for (int i=0;i<=9;i++)
{
if (!visit[i])
{
visit[i]=true;
t[d]=i;
dfs(d+1);
visit[i]=false;
}
} else dfs(d+1);
}
void init()
{
char str[10];
ans=0;
memset(v,false,sizeof(b));
memset(visit,false,sizeof(visit));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
scanf("%s",str);
for (int i=0;i<strlen(str);i++) {a[i]=str[i]-'A';v[a[i]]=true;lena=i;}
scanf("%s",str);
for (int i=0;i<strlen(str);i++) {b[i]=str[i]-'A';v[b[i]]=true;lenb=i;}
scanf("%s",str);
for (int i=0;i<strlen(str);i++) {c[i]=str[i]-'A';v[c[i]]=true;lenc=i;}
dfs(0);
printf("%d\n",ans);
}
int main()
{
freopen("1.in","r",stdin);
freopen("out","w",stdout);
int Case;
scanf("%d",&Case);
while (Case--) init();
return 0;
}

 

后记:以后一定要注意先观察数据范围再做思考...

posted @ 2012-02-22 09:50  Evan1004  阅读(225)  评论(0编辑  收藏  举报