HDU 3699 A hard Aoshu Problem (暴力搜索)
题意:题意:给你3个字符串s1,s2,s3;要求对三个字符串中的字符赋值(同样的字符串进行同样的数字替换),
替换后的三个数进行四则运算要满足左边等于右边。求有几种解法。
Sample Input
2 A A A BCD BCD B
Sample Output
5 72
eg:ABBDE ABCCC BDBDE ;令 A = 1, B = 2, C = 0, D = 4, E = 5
12245 + 12000 = 24245;
注意没有前导零!
!
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<string> #include<queue> #include<map> #include<math.h> #include<algorithm> #include<iostream> using namespace std; const int kind = 26; const int maxn = 250*1000; //注意RE,单词长度*单词个数 const int M = 5100000; int vis[10],flag[10],l,ans; char s1[10],s2[10],s3[10],s[10]; map<char,int>mp,dl; void Cal() { int a=0,b=0,c=0; for(int i=0;i<strlen(s1);i++) a=a*10+mp[s1[i]]; for(int i=0;i<strlen(s2);i++) b=b*10+mp[s2[i]]; for(int i=0;i<strlen(s3);i++) c=c*10+mp[s3[i]]; if(a+b==c) ans++; if(a-b==c) ans++; if(a*b==c) ans++; if(b&&a==b*c) ans++; } void dfs(int num) { if(num>=l) { Cal(); return; } for(int i=0;i<10;i++) { if(i==0&&dl[s[num]]) continue; if(!flag[i]) { flag[i]=1; mp[s[num]]=i; dfs(num+1); flag[i]=0; } } } int main() { int t; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); mp.clear();dl.clear(); ans=0; scanf("%s%s%s",s1,s2,s3); if(strlen(s1)>1) dl[s1[0]]=1; if(strlen(s2)>1) dl[s2[0]]=1; if(strlen(s3)>1) dl[s3[0]]=1; int i,k,j; l=0; for(i=0;i<strlen(s1);i++) { if(vis[s1[i]-'A']) continue; vis[s1[i]-'A']++; s[l++]=s1[i]; } for(i=0;i<strlen(s2);i++) { if(vis[s2[i]-'A']) continue; vis[s2[i]-'A']++; s[l++]=s2[i]; } for(i=0;i<strlen(s3);i++) { if(vis[s3[i]-'A']) continue; vis[s3[i]-'A']++; s[l++]=s3[i]; } dfs(0); printf("%d\n",ans); } return 0; } /* 2 A A A BCD BCD B */