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
题意:
给出 N(3 ~ 9),代表有N个数,有3种操作符,分别是 + 加法,- 减法,” “ 连续(空格说明相邻的这两个数合在一起,比如 2 3 代表23,1 2 3代表123),找到适合的等式使结果和为0。最后按字典序输出。
思路:
DFS。先把符号存起来当为 N - 1的时候再继续判断等式时候和为0,注意处理空格符号。
AC:
/* TASK:zerosum LANG:C++ ID:sum-g1 */ #include<stdio.h> #include<string.h> #include<stdlib.h> char way[5],fin[10]; int n; void dfs(int ans,char ope) { fin[ans] = ope; if(ans == n - 1) { int num[10],sum = 0; for(int i = 1;i <= n;i++) num[i] = i; for(int i = 1;i <= n - 1;i++) { int k = i,t = num[i]; while(fin[k] == ' ') { t = t * 10 + num[k + 1]; k++; } if(t != num[i]) num[i] = t; } sum += num[1]; for(int i = 1;i <= n - 1;i++) { if(fin[i] == ' ') continue; if(fin[i] == '+') sum += num[i + 1]; if(fin[i] == '-') sum -= num[i + 1]; } if(!sum) { printf("%d",1); for(int i = 1;i <= n - 1;i++) printf("%c%d",fin[i],i + 1); printf("\n"); } return; } for(int i = 1;i <= 3;i++) dfs(ans + 1,way[i]); } int main() { freopen("zerosum.in","r",stdin); freopen("zerosum.out","w",stdout); way[1] = ' ';way[2] = '+';way[3] = '-'; scanf("%d",&n); for(int i = 1;i <= 3;i++) dfs(1,way[i]); return 0; }