USACO 2.3 Zero Sum

来源:互联网 发布:mysql数据库存图片 编辑:程序博客网 时间:2024/06/05 09:39

题目:

Zero Sum

Consider the sequence of digits from 1 through N (where N=9) in increasing order: 1 2 3 ... N.

Now insert either a `+' for addition or a `-' for subtraction or a ` ' [blank] to run the digits together between each pair of digits (not in front of the first digit). Calculate the result that of the expression and see if you get zero.

Write a program that will find all sequences of length N that produce a zero sum.

PROGRAM NAME: zerosum

INPUT FORMAT

A single line with the integer N (3 <= N <= 9).

SAMPLE INPUT (file zerosum.in)

7

OUTPUT FORMAT

In ASCII order, show each sequence that can create 0 sum with a `+', `-', or ` ' between each pair of numbers.

SAMPLE OUTPUT (file zerosum.out)

1+2-3+4-5-6+71+2-3-4+5+6-71-2 3+4+5+6+71-2 3-4 5+6 71-2+3+4-5+6-71-2-3-4-5+6+7

思路: 水题。深搜,生成字符串,然后判断该字符串是否符合要求,输出。

代码:

/*ID: gjj50201LANG: C++TASK: zerosum*/#include <stdio.h>#include <string>#include <iostream>#include <algorithm>#include <queue>using namespace std;int n;char digits[10] = {'0','1','2','3','4','5','6','7','8','9'};queue<string> ans;bool check(string s){int sum = 0;queue <char> op;queue <int> num;for(int i=0;i<=s.size();i++){if(i == s.size())num.push(sum);else if(s[i] == '+' || s[i] == '-'){op.push(s[i]);num.push(sum);sum = 0;}else if(s[i]>='1' && s[i]<= '9')sum = sum*10 + s[i] - '0';}int d1,d2;d1 = num.front();num.pop();while(!op.empty()){char o;o = op.front();op.pop();d2 = num.front();num.pop();switch(o){case '+':{d1  = d1 + d2;break;}case '-':{d1 = d1 - d2;break;}}}    if(d1 == 0){return true;}elsereturn false;}void dfs(string s,int k){s = s + digits[k];if(k == n){if(check(s))ans.push(s);return;}dfs(s+' ',k+1);dfs(s+'+',k+1);dfs(s+'-',k+1);return;}int main(){freopen("zerosum.in","r",stdin);freopen("zerosum.out","w",stdout);cin>>n;dfs("",1);while(!ans.empty()){cout<<ans.front()<<endl;ans.pop();}return 0;}

0 0