Description
请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N。 现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将每一对数字组合在一起(请不在第一个数字前插入符号)。 计算该表达式的结果并注意你是否得到了和为零。 请你写一个程序找出所有产生和为零的长度为N的数列。
Input
单独的一行表示整数N (3 <= N <= 9)。
Output
按照ASCII码的顺序,输出所有在每对数字间插入“+”, “-”, 或 “ ”后能得到和为零的数列。(注意:就算两个数字之间没有插入符号也应该保留空格)
Sample Input
7
Sample Output
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
思路:该问题是一个DFS,我们可以把问题不断枚举" ","+","-"这三种情况,然后设置三个参数DFS(pos,sum,num)
pos指的是当前位置,sum为整个算式的和,num为当前数。
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <set>
typedef long long LL;
const long long INF = 0x3f3f3f3f;
const long long mod = 1e9+7;
const double PI = acos(-1.0);
const int maxx = 125000;
#define MAX 10010
using namespace std;
int month[2][13]= {{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int N;
char a[20];
void dfs(int pos,int sum,int num)
{
if(pos==N)
{
if(sum+num==0)
{
cout<<a<<endl;
}
return ;
}
a[pos*2-1]=' ';
if(num>0)
{
dfs(pos+1,sum,num*10+pos+1);
}
else
{
dfs(pos+1,sum,num*10-(pos+1));
}
a[pos*2-1]='+';
dfs(pos+1,sum+num,pos+1);
a[pos*2-1]='-';
dfs(pos+1,sum+num,-(pos+1));
}
int main()
{
cin>>N;
for(int i=0;i<N;i++)
{
a[2*i]=i+'1';
}
dfs(1,0,1);
return 0;
}