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;
}