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) 编辑 收藏 举报