计蒜客课程系列:蒜头学算术(DFS)


Link:http://www.jisuanke.com/course/8/349


蒜头的数学实在是太差了,于是老师把他关到小黑屋让他闭门修炼。老师跟他一张纸,上面一排写着1, 2, 3...N这N个数,中间用空白分隔。老师让他在空白处填上加号或者减号。他让蒜头君求出一共有多少种加运算符的方法使得整个表达式的值为0,并输出所有的方案。比如N=7时,1 2 3 4 5 6 7排成一排,一种插入符号的方案为1+2-3+4-5-6+7=0。是不是很有趣,快来帮蒜头君解出这题吧(*´▽`)ノノ

输入为一行,包含一个整数N(3≤N≤9)。

输出为所有在每对数字间插入“+”或“-”后能得到和为零的数列,并按照字典(ASCII码)序排列。如果无解就输出一行None。

不知道字典序和ASCII也不要紧,我们看样例输出就清楚啦,1到N排成一排,先每个位置优先放"+",再放"-",这么放的原因是因为"+"的ASCII码要比"-"小。

样例1

输入:

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


AC code:

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;
int n,i,fg;
char a[22];
void dfs(int idx,int ret)
{
    if(idx==n){
        if(ret==0){
            fg=1;
            printf("1");
            for(i=1;i<=n-1;i++)
                printf("%c%d",a[i],i+1);
            puts("");
        }
        return;
    }
       a[idx]='+';
       dfs(idx+1,ret+idx+1);
       a[idx]='-';
       dfs(idx+1,ret-(idx+1));
}
int main(){
    while(scanf("%d",&n)==1){
        fg=0;
        dfs(1,1);
        if(!fg)
            printf("None\n");
    }
    return 0;
}


你可能感兴趣的:(算法,ACM,DFS)