题目:
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+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
思路: 水题。深搜,生成字符串,然后判断该字符串是否符合要求,输出。
代码:
/*
ID: gjj50201
LANG: 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;
}
else
return 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;
}