Zero Sum chapter 2.3 dfs

  dfs枚举过,完全没有剪枝,最后的个求sum函数倒是有点麻烦

  1 /*
  2 
  3 ID: hubiao cave
  4 
  5 PROG: zerosum
  6 
  7 LANG: C++
  8 
  9 */
 10 
 11 
 12 
 13 
 14 #include<iostream>
 15 
 16 #include<fstream>
 17 
 18 #include<string>
 19 
 20 #include<set>
 21 using namespace std;
 22 
 23 
 24  set<string,less<string> >ss;
 25 
 26 char ch[3]={' ','+','-'};
 27 
 28 
 29 
 30 void dfs(int);
 31 bool proc(string);
 32 
 33 int N;
 34 int main()
 35 
 36 {
 37 
 38 
 39     ifstream fin("zerosum.in");
 40 
 41     ofstream fout("zerosum.out");
 42     
 43 fin>>N;
 44     dfs(1);
 45     for(set<string>::iterator it=ss.begin();it!=ss.end();++it)
 46     {
 47         fout<<*it<<endl;
 48     }
 49 
 50     return 0;
 51 
 52 
 53 }
 54 
 55 string str;
 56 
 57 void dfs(int n)
 58 {
 59     if(n<N)
 60     {
 61             str+='0'+n;
 62             for(int i=0;i<3;++i)
 63             {
 64                 str+=ch[i];
 65                 dfs(n+1);
 66                 str.erase(str.length()-1,1);
 67             }
 68             str.erase(str.length()-1,1);
 69     }
 70     else
 71     {
 72         str+='0'+n;
 73         if(proc(str))
 74            ss.insert(str);
 75         str.erase(str.length()-1,1);
 76     }
 77 }
 78 
 79 bool proc(string str)
 80 {
 81     int sum=0;
 82     int prenum=0;
 83     bool prespace=false;
 84     char preope='@';
 85 
 86     if(str=="1+2 3+4+5+6+7" )
 87         str="1+2 3+4+5+6+7 ";
 88     for(int i=0;i<str.length();i++)
 89     {
 90         if(str[i]>='1'&&str[i]<='9')
 91         {
 92             if(prespace==true)
 93             {
 94                 prenum=prenum*10+str[i]-'0';
 95                 prespace=false;
 96             }
 97             else
 98             {
 99                 prenum=str[i]-'0';
100             }
101         //    continue;
102         }
103         if(str[i]==' ')
104         {
105             prespace=true;
106             continue;
107 
108         }
109 
110         if(str[i]=='+'||str[i]=='-')
111         {
112             if(preope=='@')
113             {
114                 sum=prenum;
115                 preope=str[i];
116             }
117             else
118             {
119                 if(preope=='+')
120                     sum=sum+prenum;
121                 else
122                     sum=sum-prenum;
123                 preope=str[i];
124             }
125             continue;
126         }
127 
128         if(i==str.length()-1)
129         {
130             if(preope=='@')
131                 sum=prenum;
132             else
133             {
134                 if(preope=='+')
135                     sum=sum+prenum;
136                 else
137                     sum=sum-prenum;
138             }
139         }
140     }
141     return !sum;
142 }

 

posted @ 2013-09-09 17:00  cavehubiao  阅读(196)  评论(0)    收藏  举报