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 }