USACO Section2.3 Zero Sum 解题报告 【icedream61】

    zerosum解题报告
------------------------------------------------------------------------------------------------------------------------------------------------
【题目】
  给你N。
  把1到N依次写出,每相邻两个数字中间加上一个字符,三选一:'+','-',' '。
  如此,便可形成很多表达式,把其中计算结果为0的按字典序输出。
【数据范围】
  3<=N<=9
【输入样例】
  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
  1-2-3-4-5+6+7
------------------------------------------------------------------------------------------------------------------------------------------------
【分析】
  枚举。脑子清楚,代码别写错就好。
------------------------------------------------------------------------------------------------------------------------------------------------
【总结】
  一遍AC。

------------------------------------------------------------------------------------------------------------------------------------------------

【代码】

 1 /*
 2 ID: icedrea1
 3 PROB: zerosum
 4 LANG: C++
 5 */
 6 
 7 #include <iostream>
 8 #include <fstream>
 9 using namespace std;
10 
11 int N;
12 char mark[9];
13 
14 int get(int &l)
15 {
16     int r=l;
17     while(r<N && mark[r]==' ') ++r;
18     int x=0;
19     for(int i=l;i<=r;++i) x=x*10+i;
20     l=r+1;
21     return x;
22 }
23 
24 void get(int i,char &c)
25 {
26     c=mark[i-1];
27 }
28 
29 void print(ostream& out)
30 {
31     for(int i=1;i<=N-1;++i) out<<i<<mark[i];
32     out<<N<<endl;
33 }
34 
35 void test(ostream& out)
36 {
37     //cout<<"test: "; print(cout);
38     int r=0;
39     char c='+';
40     for(int i=1,num=get(i);;num=get(i))
41     {
42         if(c=='+') r+=num; else r-=num;
43         if(i==N+1) break; else get(i,c);
44     }
45     if(r==0) print(out);
46 }
47 
48 void go(int i,ostream& out)
49 {
50     //cout<<i<<endl;
51     if(i==N) { test(out); return; }
52     mark[i]=' '; go(i+1,out);
53     mark[i]='+'; go(i+1,out);
54     mark[i]='-'; go(i+1,out);
55 }
56 
57 int main()
58 {
59     //printf("%d %d %d\n",'+','-',' ');
60 
61     ifstream in("zerosum.in");
62     ofstream out("zerosum.out");
63 
64     in>>N;
65 
66     go(1,out);
67 
68     in.close();
69     out.close();
70     return 0;
71 }

 

posted on 2015-05-23 18:14  IceDream61  阅读(193)  评论(0编辑  收藏  举报

导航