void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出1到n的数字排列,可以在中间加上'+','-',' '期中,空格表示这个由这几个数字组成的一个整数,如1 2 4等价于124

由于数据n比较小,所以可以直接用dfs来枚举即可。

 1 /*
2 ID: xvoid191
3 LANG: C++
4 TASK: zerosum
5 */
6 #include <cstdio>
7 #include <iostream>
8 #include <algorithm>
9 #include <string>
10 using namespace std;
11 int n;
12 void dfs(int step,int sum,int num, string s){//三种符号从空格开始,递归遍历
13 //@step 当前要处理的数字
14 //@sum 已经处理过的数字和
15 //@num 当前处理数字的值
16 //@s 处理数字后的字符串
17 if(step == n){
18 if(sum + num == 0){
19 cout<<s<<endl;
20 }
21 return ;//fxck,step==n的时候就可以return了,导致一直re错误
22 }
23 if(num > 0){
24 dfs(step + 1, sum, num * 10 + step + 1, s+" "+char('0'+step+1));
25 }
26 else {
27 dfs(step + 1, sum, num * 10 - step - 1, s+" "+char('0'+step+1));
28 }
29 dfs(step + 1, sum + num , step+1, s+"+"+char('0' + step + 1));
30 dfs(step + 1, sum + num , -1*step-1, s+"-"+char('0' + step + 1));
31
32 }
33
34 int main()
35 {
36 freopen("zerosum.in","r",stdin);
37 freopen("zerosum.out","w",stdout);
38 scanf("%d",&n);
39 dfs(1,0,1,"1");
40
41 }

 

posted on 2012-02-02 21:48  void-man  阅读(333)  评论(0)    收藏  举报