虫食算 dfs+剪枝

来源:互联网 发布:手机短信软件哪个好 编辑:程序博客网 时间:2024/06/08 08:36

爆搜+剪枝
按加法顺序搜索,填每一个字母,然后不合法的时候return 。80分到手。
枚举的时候从n-1~0,90分。
填每一位之前,检查一遍后面所有的位数是否合法,如果后面有A+B==C—而且ABC都填过数了,但是不管进位还是不进位都不会合法的话return 。AC

#include<iostream>#include<cstdio>#include<ctime>#define LL long longusing namespace std;int n;char s1[30];char s2[30];char s3[30];int a[105];int use[105];bool vs[105];int val[105];LL tot;bool check(int x,int w){    int p3=s3[x]-'A'+1;    if(use[p3])    {        if(val[p3]!=(a[x]+w)%n)            return false;        use[p3]++;        a[x]+=w;        if(a[x]>=n)        {            a[x+1]+=a[x]/n;            a[x]%=n;        }        return true;    }    else    {        if(vs[(a[x]+w)%n])            return false;        a[x]+=w;        if(a[x]>=n)        {            a[x+1]+=a[x]/n;            a[x]%=n;        }        use[p3]=1;        val[p3]=a[x];        return true;    }}bool ans;void print(){    for(int i=1;i<=n;i++)        cout<<i<<" "<<use[i]<<" "<<val[i]<<endl;}int T1,T2;bool ret(int x){    int p=s1[x]-'A'+1;    int q=s2[x]-'A'+1;    int p3=s3[x]-'A'+1;    if(use[p]&&use[q]&&use[p3])    {        int w=(val[p]+val[q])%n;        if(w<val[p3]-1) return false;        if(w>val[p3]&&(w!=n-1||val[p3]!=0))             return false;    }    return true;}void dfs(int x){    if(x>n||ans)    {        if(!ans)        {            ans=1;            for(int i=1;i<=n;i++)            {                printf("%d",val[i]);                if(i!=n) printf(" ");            }        }        return ;    }    for(int i=x+1;i<=n;i++)    if(!ret(i)) return;    int p=s1[x]-'A'+1;    int q=s2[x]-'A'+1;    int p3=s3[x]-'A'+1;    if(use[p])    {        if(use[q])        {            int w=val[p]+val[q];            if(check(x,w))            {                dfs(x+1);                a[x]+=a[x+1]*n;                a[x]-=w;                a[x+1]=0;                use[p3]--;            }        }        else        {            for(int i=n-1;i>=0;i--)                if(!vs[i])                {                    vs[i]=1;                    use[q]++;                    val[q]=i;                    int w=val[p]+val[q];                    if(check(x,w))                    {                        dfs(x+1);                        a[x]+=a[x+1]*n;                        a[x]-=w;                        a[x+1]=0;                        use[p3]--;                    }                    vs[i]=0;                    use[q]--;                }        }    }    else if(use[q])    {        for(int i=n-1;i>=0;i--)            if(!vs[i])            {                vs[i]=1;                use[p]++;                val[p]=i;                int w=val[p]+val[q];                if(check(x,w))                {                    dfs(x+1);                    a[x]+=a[x+1]*n;                    a[x]-=w;                    a[x+1]=0;                    use[p3]--;                }                vs[i]=0;                use[p]--;            }    }    else    {        for(int i=n-1;i>=0;i--)        {            if(!vs[i])            {                vs[i]=1;                use[p]++;                val[p]=i;                if(!use[q])                    for(int j=0;j<n;j++)                    {                        if(!vs[j])                        {                            vs[j]=1;                            use[q]++;                            val[q]=j;                            int w=val[p]+val[q];                            if(check(x,w))                            {                                dfs(x+1);                                a[x]+=a[x+1]*n;                                a[x]-=w;                                a[x+1]=0;                                use[p3]--;                            }                            vs[j]=0;                            use[q]--;                        }                    }                else                {                    int w=val[p]+val[q];                    if(check(x,w))                    {                        dfs(x+1);                        a[x]+=a[x+1]*n;                        a[x]-=w;                        a[x+1]=0;                        use[p3]--;                    }                }                vs[i]=0;                use[p]--;            }        }    }}int main(){    scanf("%d",&n);    scanf("%s%s%s",s1+1,s2+1,s3+1);    for(int i=1;i<=n/2;i++)    {        swap(s1[i],s1[n-i+1]);        swap(s2[i],s2[n-i+1]);        swap(s3[i],s3[n-i+1]);    }    dfs(1);    return 0;}
3 1
原创粉丝点击