洛谷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)\n",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)\n",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\n",k,i);
                if(be[a[2][k]])
                {
//                    printf("  h=2 l=%d map=%d\n",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\n",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\n",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\n",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\n",k,map[a[1][k]]);
        if(be[a[2][k]])
        {
//            printf("  h=2 l=%d map=%d\n",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\n",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\n",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\n",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\n",k,i);
                if(be[a[2][k]])
                {
//                    printf("  h=2 l=%d map=%d\n",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\n",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\n",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\n",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\n",k,map[a[1][k]]);
        if(be[a[2][k]])
        {
//            printf("  h=2 l=%d map=%d\n",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\n",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\n",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\n",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);
}

 

posted on 2018-02-26 21:16  Narh  阅读(197)  评论(0编辑  收藏  举报

导航