• 洛谷1092虫食算


    蜜汁。还不知道自己那种为什么不行。而且输入的奇怪错误?

    dfs。

    1.仅按列枚举两个加数,就能算出该位的得数;

    2.从右往左枚举可以记录进位;

    3.每确定一个值就把整个式子都跑一遍看看有没有不合法处。

    对于得数是否合法的判断需要想好。合法的仅两种:都没赋值 或 都赋了值且值相等。

    AC代码:

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    int n,map[300],jin[30];
    char ch,a[5][30];
    bool use[30],be[300];
    void clear(int h,int l,int num)
    {
        map[a[h][l]]=0;use[num]=0;be[a[h][l]]=0;
    }
    void giv(int h,int l,int num)
    {
        map[a[h][l]]=num;use[num]=1;be[a[h][l]]=1;
    }
    bool check(int l,int num)
    {
        if((!be[a[3][l]]&&!use[num])||(be[a[3][l]]&&use[num]&&map[a[3][l]]==num))return 0;
        return 1;
    }
    bool checkk(int l)
    {
        for(int k=l;k>=0;k--)
            if(be[a[1][k]]&&be[a[2][k]]&&be[a[3][k]])
            {
                int c=map[a[1][k]]+map[a[2][k]];
                int c1=c%n,c2=(c+1)%n;
                if(map[a[3][k]]!=c1&&map[a[3][k]]!=c2)return 1;
            }
        return 0;
    }
    void dfs2(int h,int l)
    {
    //    printf("(h=%d l=%d)
    ",h,l);
        if(l<0)
        {
            for(int i=65;i<=91;i++)
                if(be[i])printf("%d ",map[i]);
            exit(0);
        }
        if(checkk(l))return;
        if(h==3)
        {
            int c=map[a[1][l]]+map[a[2][l]]+jin[l];
            jin[l-1]=0;
            if(c>=n)jin[l-1]=1,c-=n;
            if(check(l,c))return;
            bool flag=0;
            if(!be[a[h][l]])giv(h,l,c),flag=1;
    //        printf("(h=%d l=%d  %d %d %d)
    ",h,l,map[a[1][l]],map[a[2][l]],map[a[3][l]]);
            dfs2(1,l-1);
            if(flag)clear(h,l,c);
            return;
        }
        else if(!be[a[h][l]])
        {
            for(int i=0;i<n;i++)
                if(!use[i])
                {
                    giv(h,l,i);
                    dfs2(h+1,l);
                    clear(h,l,i);
                }
        }
        else dfs2(h+1,l);
    }
    int main()
    {
        scanf("%d",&n);
        cin>>a[1];
        cin>>a[2];
        cin>>a[3];
    //    for(int i=1;i<=3;i++)
    //    {
    //        scanf("%c",&ch);
    //        for(int j=1;j<=n;j++)
    //        {
    //            scanf("%c",&ch);
    //            a[i][j]=ch-64;
    //        }
    //    }
        dfs2(1,n-1);
    }

    原来的写法(10分蜜汁,按列枚举)

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    int n,map[300];
    char a[5][30];
    bool use[30],be[300];
    void clear(int h,int l,int num)
    {
        map[a[h][l]]=0;use[num]=0;be[a[h][l]]=0;
    }
    void giv(int h,int l,int num)
    {
        map[a[h][l]]=num;use[num]=1;be[a[h][l]]=1;
    }
    bool check(int l,int num)
    {
        if((!be[a[3][l]]&&!use[num])||(be[a[3][l]]&&use[num]&&map[a[3][l]]==num))return 0;
        return 1;
    }
    bool checkk(int l)
    {
        for(int k=l;k>=0;k--)
            if(be[a[1][k]]&&be[a[2][k]]&&be[a[3][k]])
            {
                int c=map[a[1][k]]+map[a[2][k]];
                int c1=c%n,c2=(c+1)%n;
                if(map[a[3][k]]!=c1&&map[a[3][k]]!=c2)return 1;
            }
        return 0;
    }
    void dfs(int k,int plus)
    {
        if(k<0)
        {
            for(int i=65;i<=91;i++)
                if(be[i])printf("%d ",map[i]);
            exit(0);
        }
        if(!be[a[1][k]])
            for(int i=0;i<n;i++)
                if(!use[i])
                {
                    giv(1,k,i);
    //                printf("h=1 l=%d map=%d
    ",k,i);
                    if(be[a[2][k]])
                    {
    //                    printf("  h=2 l=%d map=%d
    ",k,map[a[2][k]]);
                        bool flag=0;
                        int c=i+map[a[2][k]]+plus;
                        int plu=c/n;c%=n;
                        if(check(k,c))
                        {
    //                        printf("! h=3 l=%d map=%d c=%d
    ",k,map[a[3][k]],c);
                            clear(1,k,i);continue;
                        }
                        if(!be[a[3][k]])giv(3,k,c),flag=1;
                        if(checkk(k))
                        {
                            clear(1,k,i);continue;
                        }
                        dfs(k-1,plu);
                        if(flag)clear(3,k,c);
                    }
                    else
                    {
                        for(int j=0;j<n;j++)
                            if(!use[j])
                            {
                                bool flag=0;
                                giv(2,k,j);
    //                            printf("  h=2 l=%d map=%d
    ",k,map[a[2][k]]);
                                int c=i+j+plus;
                                int plu=c/n;c%=n;
                                if(check(k,c))
                                {
    //                                printf("! h=3 l=%d map=%d c=%d
    ",k,map[a[3][k]],c);
                                    clear(2,k,j);continue;
                                }
                                if(!be[a[3][k]])giv(3,k,c),flag=1;
                                if(checkk(k))
                                {
                                    clear(2,k,j);continue;
                                }
                                dfs(k-1,plu);
                                if(flag)clear(3,k,c);
                                clear(2,k,j);
                            }
                        }
                    clear(1,k,i);    
                }
        if(be[a[1][k]])
        {
    //        printf("h=1 l=%d map=%d
    ",k,map[a[1][k]]);
            if(be[a[2][k]])
            {
    //            printf("  h=2 l=%d map=%d
    ",k,map[a[2][k]]);
                bool flag=0;
                int c=map[a[1][k]]+map[a[2][k]]+plus;
                int plu=c/n;c%=n;
                if(check(k,c))
                {
    //                printf("! h=3 l=%d map=%d c=%d
    ",k,map[a[3][k]],c);
                    return;
                }
                if(!be[a[3][k]])giv(3,k,c),flag=1;
                if(checkk(k))return;
                dfs(k-1,plu);
                if(flag)clear(3,k,c);
            }
            else
            {
    //            printf("  h=2 l=%d map=%d
    ",k,map[a[2][k]]);
                for(int i=0;i<n;i++)
                    if(!use[i])
                    {
                        bool flag=0;
                        giv(2,k,i);
                        int c=map[a[1][k]]+i+plus;
                        int plu=c/n;c%=n;
                        if(check(k,c))
                        {
    //                        printf("! h=3 l=%d map=%d c=%d
    ",k,map[a[3][k]],c);
                            clear(2,k,i);continue;
                        }
                        if(!be[a[3][k]])giv(3,k,c),flag=1;
                        if(checkk(k))
                        {
                            clear(2,k,i);continue;
                        }
                        dfs(k-1,plu);
                        if(flag)clear(3,k,c);
                        clear(2,k,i);
                    }
            }
        }
    }
    int main()
    {
        scanf("%d",&n);
        cin>>a[1];
        cin>>a[2];
        cin>>a[3];
        dfs(n-1,0);
    }

    更加原来的,与上面相比输入不同(0分)

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    int n,a[5][30],map[30];
    char ch;
    bool use[30],be[30];
    void clear(int h,int l,int num)
    {
        map[a[h][l]]=0;use[num]=0;be[a[h][l]]=0;
    }
    void giv(int h,int l,int num)
    {
        map[a[h][l]]=num;use[num]=1;be[a[h][l]]=1;
    }
    bool check(int l,int num)
    {
        if((!be[a[3][l]]&&!use[num])||(be[a[3][l]]&&use[num]&&map[a[3][l]]==num))return 0;
        return 1;
    }
    bool checkk()
    {
        for(int k=1;k<=n;k++)
            if(be[a[1][k]]&&be[a[2][k]]&&be[a[3][k]])
            {
                int c=map[a[1][k]]+map[a[2][k]];
                int c1=c%n,c2=(c+1)%n;
                if(map[a[3][k]]!=c1&&map[a[3][k]]!=c2)return 1;
            }
        return 0;
    }
    void dfs(int k,int plus)
    {
        if(checkk())return;
        if(!k)
        {
            for(int i=1;i<=n;i++)
                printf("%d ",map[i]);
            exit(0);
        }
        if(!be[a[1][k]])
            for(int i=0;i<n;i++)
                if(!use[i])
                {
                    giv(1,k,i);
    //                printf("h=1 l=%d map=%d
    ",k,i);
                    if(be[a[2][k]])
                    {
    //                    printf("  h=2 l=%d map=%d
    ",k,map[a[2][k]]);
                        bool flag=0;
                        int c=i+map[a[2][k]]+plus;
                        int plu=c/n;c%=n;
                        if(check(k,c))
                        {
    //                        printf("! h=3 l=%d map=%d c=%d
    ",k,map[a[3][k]],c);
                            clear(1,k,i);continue;
                        }
                        if(!be[a[3][k]])giv(3,k,c),flag=1;
                        dfs(k-1,plu);
                        if(flag)clear(3,k,c);
                    }
                    else
                    {
                        for(int j=0;j<n;j++)
                            if(!use[j])
                            {
                                bool flag=0;
                                giv(2,k,j);
    //                            printf("  h=2 l=%d map=%d
    ",k,map[a[2][k]]);
                                int c=i+j+plus;
                                int plu=c/n;c%=n;
                                if(check(k,c))
                                {
    //                                printf("! h=3 l=%d map=%d c=%d
    ",k,map[a[3][k]],c);
                                    clear(2,k,j);continue;
                                }
                                if(!be[a[3][k]])giv(3,k,c),flag=1;
                                dfs(k-1,plu);
                                if(flag)clear(3,k,c);
                                clear(2,k,j);
                            }
                        }
                    clear(1,k,i);    
                }
        if(be[a[1][k]])
        {
    //        printf("h=1 l=%d map=%d
    ",k,map[a[1][k]]);
            if(be[a[2][k]])
            {
    //            printf("  h=2 l=%d map=%d
    ",k,map[a[2][k]]);
                bool flag=0;
                int c=map[a[1][k]]+map[a[2][k]]+plus;
                int plu=c/n;c%=n;
                if(check(k,c))
                {
    //                printf("! h=3 l=%d map=%d c=%d
    ",k,map[a[3][k]],c);
                    return;
                }
                if(!be[a[3][k]])giv(3,k,c),flag=1;
                dfs(k-1,plu);
                if(flag)clear(3,k,c);
            }
            else
            {
    //            printf("  h=2 l=%d map=%d
    ",k,map[a[2][k]]);
                for(int i=0;i<n;i++)
                    if(!use[i])
                    {
                        bool flag=0;
                        giv(2,k,i);
                        int c=map[a[1][k]]+i+plus;
                        int plu=c/n;c%=n;
                        if(check(k,c))
                        {
    //                        printf("! h=3 l=%d map=%d c=%d
    ",k,map[a[3][k]],c);
                            clear(2,k,i);continue;
                        }
                        if(!be[a[3][k]])giv(3,k,c),flag=1;
                        dfs(k-1,plu);
                        if(flag)clear(3,k,c);
                        clear(2,k,i);
                    }
            }
        }
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=3;i++)
        {
            scanf("%c",&ch);
            for(int j=1;j<=n;j++)
            {
                scanf("%c",&ch);a[i][j]=ch-64;
            }
        }
        dfs(n,0);
    }
  • 相关阅读:
    Jenkins安装及配置
    数据库命令扩展
    常用的数据库命令
    如何使用NiFi等构建IIoT系统
    云计算之概念——IaaS、SaaS、PaaS、Daas
    emqx的一个配置参数
    利用jsoup抓取网页图片
    nohup使用
    jsoup的使用
    java知识点链接
  • 原文地址:https://www.cnblogs.com/Narh/p/8476073.html
Copyright © 2020-2023  润新知