标签:
请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。现在请在数列中插入“+”表示加,或者“-”表示减,“ ”表示空白(例如1-2 3就等于1-23),来将每一对数字组合在一起(请不在第一个数字前插入符号)。计算该表达式的结果并判断其值是否为0。请你写一个程序找出所有产生和为零的长度为N的数列。
E.X:
1+2-3+4-5-6+7 1+2-3-4+5+6-7 1-2 3+4+5+6+7 1-2 3-4 5+6 7 1-2+3+4-5+6-7 1-2-3-4-5+6+7
怎么做呢。。
直接模拟
但是怎么写更加优美呢。
膜拜大神代码。简单明了
0_0_0_0_0_0_这样的先把字符串模板摆好后,神奇的dfs一下就OK了。
应为填‘ ’的时候需要把上一个数(正or负)*10再(加or减)当前数字,所以我们需要存储一下last 表示最后一个未加入sum(总和)的数字是多少。
其他的,不懂见代码。
模拟一下就OK。
代码:
/* ID:Andy Chen LANG:C++ PROG:zerosum */ #include<cstdio> #include<iostream> using namespace std; int N; char str[20]; void dfs(int k,int sum,int last){ if(k==N){ if(sum+last==0) cout<<str<<endl; return ; } str[k*2-1]=‘ ‘; dfs(k+1,sum,last>0?last*10+k+1:last*10-k-1); str[k*2-1]=‘+‘; dfs(k+1,sum+last,k+1); str[k*2-1]=‘-‘; dfs(k+1,sum+last,-k-1); } int main() { freopen("zerosum.in","r",stdin); freopen("zerosum.out","w",stdout); scanf("%d",&N); for(int i=0;i<N;++i) str[i*2]=char(i+‘1‘); dfs(1,0,1); return 0; }
标签:
原文地址:http://www.cnblogs.com/cherry231/p/5158531.html