题目连接:http://poj.org/problem?id=3989
题意:给3个字符串,求每个字母匹配一个数字之后成立的等式的个数。S2,S3之间为等号,S1,S2之间可为任意运算符号(+,-,*,/)。
分析:一开是给想复杂了...结果一看范围我崩溃,爆搜秒之。
附代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
#include#include #include #include 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
后记:以后一定要注意先观察数据范围再做思考...