2.3.3 Zero Sum 和為零(DFS)
阿新 • • 發佈:2018-12-10
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; }