USACO section2.3 Zero Sum题解&代码

只需要按位数搜索,记录sum为0的情况
优先度为’ ‘>’+’>’-‘,需要记录的是之前位数可以计算出的值la和当前被操作的数no,下一个被操作数为p,当前位数后的符号即为s[p]
需要注意的一些小细节是在不加入操作符增加no时no>=0?no*10+p:no*10-p,在添加’-‘后下一个操作数将会是-p

/*
ID:rainbow16
LANG:C++
TASK:zerosum
*/
#include<stdio.h>
int n;
char s[10];
void dfs(int la,int no,int p)
{
    if(p==n+1)
    {
        if(la+no==0)
            for(int i=1;i<=n;i++)
                printf("%d%c",i,s[i]);
        return;
    }
    s[p-1]=' ';
    dfs(la,no>=0?no*10+p:no*10-p,p+1);
    s[p-1]='+';
    dfs(la+no,p,p+1);
    s[p-1]='-';
    dfs(la+no,-p,p+1);
}
int main(void)
{
    freopen("zerosum.in","r",stdin);
    freopen("zerosum.out","w",stdout);
    scanf("%d",&n);
    s[n]='\n';
    dfs(0,1,2);
    return 0;
}

你可能感兴趣的:(C++,USACO)