天天看點

hdu_4403 A very hard Aoshu problem 暴力搜尋

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str[20];
#define N 32100
int temp1[N],temp2[N];
int cnt1,cnt2;

void dfs1(int pos,int l,int cnt,int pre)
{
    if(pos==l)
    {
       if(!cnt)
        temp1[cnt1++]=pre+cnt;
        return;
    }
    dfs1(pos+1,l,10*cnt+(str[pos]-'0'),pre);
    dfs1(pos+1,l,0,pre+10*cnt+(str[pos]-'0'));
}

void dfs2(int pos,int l,int cnt,int pre)
{
    if(pos==l)
    {
       if(!cnt)
        temp2[cnt2++]=pre+cnt;
        return;
    }
    dfs2(pos+1,l,10*cnt+(str[pos]-'0'),pre);
    dfs2(pos+1,l,0,pre+10*cnt+(str[pos]-'0'));
}
int main()
{
  while(scanf("%s",str)!=EOF)
  {
      if(strcmp(str,"END")==0) break;
      int l=strlen(str);
      int ans=0;
      for(int i=1;i<=l-1;i++)
      {
          cnt1=0;
          cnt2=0;
          if(i==1)temp1[cnt1++]=str[0]-'0';
          else  dfs1(0,i,0,0);
          if(i+1==l) temp2[cnt2++]=str[i]-'0';
          else dfs2(i,l,0,0);
          /*printf("%d %d**\n",cnt1,cnt2);
         // if(i==1){
          for(int j=0;j<cnt1;j++)
          printf("%d ",temp1[j]);
          puts("");
           for(int j=0;j<cnt2;j++)
          printf("%d ",temp2[j]);
          puts("");
          //}*/
          for(int j=0;j<cnt1;j++)
          {
              for(int h=0;h<cnt2;h++)
              {
                  if(temp1[j]==temp2[h]) ans++;
              }
          }
      }
      printf("%d\n",ans);
  }
    return 0;
}
           

就是暴力枚舉等号的位置,然後對等号兩邊分别在枚舉,找出相等的就行了。。。

注意數組要大點,第一次數組越界了。。。。找一下大概範圍