您的位置:首页 > 其它

Zero Sum chapter 2.3 dfs

2013-09-09 17:00 169 查看
dfs枚举过,完全没有剪枝,最后的个求sum函数倒是有点麻烦

/*

ID: hubiao cave

PROG: zerosum

LANG: C++

*/

#include<iostream>

#include<fstream>

#include<string>

#include<set>
using namespace std;

set<string,less<string> >ss;

char ch[3]={' ','+','-'};

void dfs(int);
bool proc(string);

int N;
int main()

{

ifstream fin("zerosum.in");

ofstream fout("zerosum.out");

fin>>N;
dfs(1);
for(set<string>::iterator it=ss.begin();it!=ss.end();++it)
{
fout<<*it<<endl;
}

return 0;

}

string str;

void dfs(int n)
{
if(n<N)
{
str+='0'+n;
for(int i=0;i<3;++i)
{
str+=ch[i];
dfs(n+1);
str.erase(str.length()-1,1);
}
str.erase(str.length()-1,1);
}
else
{
str+='0'+n;
if(proc(str))
ss.insert(str);
str.erase(str.length()-1,1);
}
}

bool proc(string str)
{
int sum=0;
int prenum=0;
bool prespace=false;
char preope='@';

if(str=="1+2 3+4+5+6+7" )
str="1+2 3+4+5+6+7 ";
for(int i=0;i<str.length();i++)
{
if(str[i]>='1'&&str[i]<='9')
{
if(prespace==true)
{
prenum=prenum*10+str[i]-'0';
prespace=false;
}
else
{
prenum=str[i]-'0';
}
//    continue;
}
if(str[i]==' ')
{
prespace=true;
continue;

}

if(str[i]=='+'||str[i]=='-')
{
if(preope=='@')
{
sum=prenum;
preope=str[i];
}
else
{
if(preope=='+')
sum=sum+prenum;
else
sum=sum-prenum;
preope=str[i];
}
continue;
}

if(i==str.length()-1)
{
if(preope=='@')
sum=prenum;
else
{
if(preope=='+')
sum=sum+prenum;
else
sum=sum-prenum;
}
}
}
return !sum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: