• 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 }
  • 相关阅读:
    enumerate函数和zip函数返回的对象,都需要用list()函数转换为列表
    zip函数
    列表和元组的互相转换
    元组和列表的区别
    帮小朋友写的第一个程序
    remove del pop的区别
    如何运用Linux进行查看tomcat日志
    Linux大全
    liunx中组合查询的命令
    常见的问题
  • 原文地址:https://www.cnblogs.com/cavehubiao/p/3310189.html
Copyright © 2020-2023  润新知