CDOJ1085 基爷与加法等式 爆搜DFS

题目链接:

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 }

 

posted @ 2017-02-26 11:41  _yxg123  阅读(122)  评论(0编辑  收藏  举报