暴力DFSG 等价交换

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<set>
#include<map>
#include<vector>
#include<cstring>
#include<stack>
#include<cmath>
#include<queue>
using namespace std;
#define CL(x,v); memset(x,v,sizeof(x));
#define INF 0x3f3f3f3f
#define LL long long
#define REP(i,n) for(int i=0;i<n;i++)
const int MAXN=15;
int g[MAXN];
int n;
//在一个等式的左边,pp为+前的数和,p为+后当前数和
//如a+bb+c=a+bb+c=a+bb+c
//当递归到第一个等号时,pp=a+bb,p=c
//s为等号和
//cas为递归到的符号
//u为递归的深度
int dfs(int u,int p,int pp,int s,int cas)
{
    if(cas==0){
    pp+=p;
    p=g[u];
    }
    if(cas==1){
         pp+=p;
         p=0;
        if(s==-1){
            s=pp;
            p=g[u];
            pp=0;
        }else{
            if(s!=pp)return 0;
            p=g[u];
            pp=0;
        }
    }
    if(cas==2){
        p=p*10+g[u];
    }
    if(u==n-1){
        if(s==-1)return 0;
        if(s==pp+p)return 1;
        else return 0;
    }
    int ans=0;
    ans+=dfs(u+1,p,pp,s,0);
    ans+=dfs(u+1,p,pp,s,1);
    ans+=dfs(u+1,p,pp,s,2);
    return ans;
}
int main(){
    while(~scanf("%d",&n))
    {
        if(n==0)break;
        REP(i,n)scanf("%d",&g[i]);
        int ans=dfs(0,0,0,-1,0);
        printf("%d\n",ans);
    }
    return 0;
}

http://oj.huangdiandian.com/OnlineJudge

原文地址:https://www.cnblogs.com/arbitrary/p/2965905.html