HDU4403 A very hard Aoshu problem

搜索提,等号只有一个可以剪枝

 1 #include <iostream>

 2 #include <queue>

 3 #include <cstring>

 4 #include <cstdio>

 5 using namespace std;

 6 char seq[50];

 7 char str[50];

 8 int n,ans,eq;

 9 bool ok(int len)

10 {

11     long long a,sum=0;

12     int i,flg=1;

13     queue<char> q;

14     q.push('+');

15     seq[len]='\0';

16     for(i=0; i<len; i++)

17     {

18         a=0;

19         while(i<=len&&seq[i]>='0'&&seq[i]<='9') a=a*10+seq[i]-'0',i++;

20         q.push(seq[i]);

21         if(flg&&q.front()=='+')

22             sum+=a;

23         else

24             flg=0,sum-=a;

25         q.pop();

26     }

27     if(sum==0) return 1;

28     else return 0;

29 }

30 void dfs(int cur,int q)

31 {

32     if(eq>1) return;

33     if(q>n)

34     {

35         if(ok(cur)) ans++;

36         return;

37     }

38     seq[cur]=str[q];

39     dfs(cur+1,q+1);

40     seq[cur]='+';

41     seq[cur+1]=str[q];

42     dfs(cur+2,q+1);

43     seq[cur]='=';

44     seq[cur+1]=str[q];

45     eq++;

46     dfs(cur+2,q+1);

47     eq--;

48 }

49 int main()

50 {

51     while(cin>>str,str[0]!='E')

52     {

53         ans=0;eq=0;

54         seq[0]=str[0];

55         n=strlen(str)-1;

56         dfs(1,1);

57         cout<<ans<<endl;

58     }

59     return 0;

60 }

 

 

 

你可能感兴趣的:(HDU)