计蒜客-组合运算式

来源:互联网 发布:淘宝爆款广告语 编辑:程序博客网 时间:2024/05/16 19:02

请考虑一个被空格分隔的,由1到N的整数组成的递增数列:1 2 3 … N。现在请在数列中插入表示加的“+”,或者表示减“-”,亦或者表示空白的“ ”(例如1-2 3就等于1-23),来将每一对数字组合成一个表达式(第一个数字前无空格)。计算该表达式的结果并判断其值是否为0。请你写一个程序找出所有产生和为零的长度为N的数列。
输入为一行,包含一个整数N(3≤N≤9)。
输出为所有在每对数字间插入“+”, “-”, 或 “ ”后能得到和为零的数列,并按照字典(ASCII码)序排列。

样例输入
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

#include"iostream"#include"vector"using namespace std;vector<char> jj;int n;void dfs(int cur,int sum){    if(cur==n+1)    {        if(sum==0)        {            for(int i=0;i<jj.size()-1;i++)            {                cout<<jj[i];            }            cout<<jj[jj.size()-1]<<endl;        }        return;    }    if(cur!=n)    {        int he=sum+cur*10+cur+1;        jj.push_back('+');        jj.push_back(cur+'0');        jj.push_back(' ');        jj.push_back(cur+1+'0');        dfs(cur+2,he);        jj.pop_back();jj.pop_back();jj.pop_back();jj.pop_back();    }        int he2=sum+cur;        jj.push_back('+');        jj.push_back(cur+'0');        dfs(cur+1,he2);        jj.pop_back();jj.pop_back();    if(cur!=n)    {        int he1=sum-cur*10-cur-1;        jj.push_back('-');        jj.push_back(cur+'0');        jj.push_back(' ');        jj.push_back(cur+1+'0');        dfs(cur+2,he1);        jj.pop_back();jj.pop_back();jj.pop_back();jj.pop_back();    }        int he3=sum-cur;        jj.push_back('-');        jj.push_back(cur+'0');        dfs(cur+1,he3);        jj.pop_back();jj.pop_back();    }int main(){    while(cin>>n)    {        jj.push_back('1');        jj.push_back(' ');        jj.push_back('2');        dfs(3,12);        jj.pop_back();jj.pop_back();jj.pop_back();        jj.push_back('1');        dfs(2,1);        jj.pop_back();    }       return 0;} 

dfs,注意题目要求按字典序输出,其中’ ‘> ‘+’ > ‘-‘;

0 0