hdu4403- A very hard Aoshu problem(搜索)

枚举等号的位置,然后暴力搜索一波 这个题本身不难,但它是我第一次使用对拍程序来查找错误,值得纪念。

 1 #include<cstdio>
 2 
 3 #include<string.h>
 4 
 5 #include<map>
 6 
 7 #include<algorithm>
 8 
 9 #define inf 0x3f3f3f3f
10 
11 const int maxn=100;
12 
13 using namespace std;
14 
15 typedef pair<int,int> P;
16 
17 int len,d,b,c,ans;
18 
19 char a[maxn+10];
20 
21 map<P,int> m1,m2;
22 
23 int cal(int l,int r){
24    if(l>r) return 0;
25    int res=0;
26    for(int i=l;i<=r;i++){
27         res=res*10+a[i]-'0';
28    }
29    return res;
30 }
31 
32 void dfs(int l,int r,int sum,int f,int eq){
33     if(!f){
34         if(l>r){
35            m1[P(sum,eq)]++;
36            return ;
37         }
38         for(int i=l;i<=r;i++){
39             dfs(i+1,r,sum+cal(l,i),0,eq);
40         }
41     } else {
42         if(l>r){
43            m2[P(sum,eq)]++;
44            return ;
45         }
46         for(int i=l;i<=r;i++){
47                 dfs(i+1,r,sum+cal(l,i),1,eq);
48         }
49 
50     }
51 }
52 
53 int main()
54 {
55    // freopen("e://duipai//data.txt","r",stdin);
56    // freopen("e://duipai//out1.txt","w",stdout);
57     while(scanf("%s",a)!=EOF){
58         if(a[0]=='E')
59         break;
60         len=strlen(a);
61         ans=0;
62         for(int i=1;i<len;i++){
63            m1.clear();
64            dfs(0,i-1,0,0,i);
65            m2.clear();
66            dfs(i,len-1,0,1,i);
67            map<P,int>::iterator it=m1.begin();
68                 for(;it!=m1.end();++it){
69                 int a=m1[P((*it).first.first,(*it).first.second)];
70                 int b=m2[P((*it).first.first,(*it).first.second)];
71                 if(a&&b) {
72                 ans+=(a*b);
73                 }
74            }
75         }
76         printf("%d\n",ans);
77     }
78     return 0;
79 }

 

posted @ 2016-08-03 19:44  GeniusYang  阅读(140)  评论(0编辑  收藏  举报