题目链接:
http://acm.uestc.edu.cn/#/problem/show/1085
题意:
题解:
因为进位,从低位搜
代码:
http://www.cnblogs.com/qscqesze/p/4489781.html
1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 #define MS(a) memset(a,0,sizeof(a)) 5 #define MP make_pair 6 #define PB push_back 7 const int INF = 0x3f3f3f3f; 8 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL; 9 inline ll read(){ 10 ll x=0,f=1;char ch=getchar(); 11 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} 12 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 13 return x*f; 14 } 15 // 16 const int maxn = 1e5+10; 17 18 int n,ma,tmp,ans; 19 string s[30]; 20 char k[100]; 21 int tp[30],ans1[30],ans2[30],H[30],mp[30],vis[10]; 22 23 bool check(){ 24 ans1[ma] = 0; 25 for(int i=ma-1; i>=0; i--){ 26 ans1[i] = 0; 27 ans2[i] = 0; 28 for(int j=0; j<n-1; j++){ 29 if(H[s[j][i]-'A'] == -1) return 0; 30 ans1[i] += H[s[j][i]-'A']; 31 } 32 if(H[s[n-1][i]-'A'] == -1) return 0; 33 ans2[i] = H[s[n-1][i]-'A']; 34 ans1[i] += (ans1[i+1]/10); 35 if((ans1[i])%10 != ans2[i]) return 1; 36 } 37 38 if(ans1[0] > 9) return 1; 39 return 0; 40 } 41 42 void dfs(int x){ 43 if(x==tmp) { 44 ans++; 45 return ; 46 } 47 48 for(int i=0; i<=9; i++){ 49 if(i==0 && tp[k[x]-'A']) continue; 50 if(vis[i]) continue; 51 vis[i] = 1; 52 H[k[x]-'A'] = i; 53 if(!check()) dfs(x+1); 54 H[k[x]-'A'] = -1; 55 vis[i] = 0; 56 } 57 58 } 59 60 int main(){ 61 while(cin >> n){ 62 for(int i=0;i<30;i++) 63 mp[i]=tp[i]=H[i]=0; 64 ma=0; 65 for(int i=0; i<n; i++){ 66 cin >> s[i]; 67 ma = max(ma,(int)s[i].size()); 68 } 69 70 for(int i=0; i<n; i++) 71 tp[s[i][0]-'A'] = 1; 72 73 for(int i=0; i<n; i++){ 74 int len = ma-s[i].size(); 75 for(int j=0; j<len; j++){ 76 s[i] = '[' + s[i]; 77 } 78 } 79 80 tmp=0; 81 ans=0; 82 for(int i=ma-1;i>=0;i--){ 83 for(int j=0;j<n;j++){ 84 if(mp[s[j][i]-'A']) continue; 85 if(s[j][i]=='[') continue; 86 k[tmp++]=s[j][i]; 87 mp[s[j][i]-'A']=1; 88 } 89 } 90 91 for(int i=0; i<tmp; i++) 92 H[k[i]-'A'] = -1; 93 94 // H['['-'A'] = 0; 95 dfs(0); 96 97 cout << ans << endl; 98 } 99 100 return 0; 101 }