zoukankan      html  css  js  c++  java
  • Luogu P1092 虫食算 爆搜

    心路历程:震惊,我竟然得了$90$分!!。。。康康数据。。。奥。。(忽然有了邪恶的卡数据的想法)

    于是把$for(int space i=0;i<n;++i)$改成了$for(int space i=n-1;i>0;--i) $

    然后,我$90$~

    然后,我开了$O2$,$A$了$OvO$。。。

    upd:然后第二天:可以再加个剪枝?

    what,我A了?$41ms(without space O2)or space 33ms (with space O2)$

    (所以就当我的是正解了$qwq$)

    我的思路很暴力:

    我的思路很暴力:
    由于最后一位没有进位,所以这一列的三个字母的关系是确定的,而不会像后面一样存在进位,所以就是暴力大枚举,对于竖式的每一列,枚举没用过的数,然后判一下这一列是否合法(记得要累积上一位的进位),合法的话,再判一下整个竖式所有已知数是否合法,合法接着搜,不合法枚举下一个。。。复杂度玄学。。。

    又臭又长又慢的代码$qwq$

    解释一下:$s[i][j]$是指第$i$行的第$j$个字母(已在$voidspace gs()$中转化为数字,'A'对应$0$,'B'对应$1$,以此类推),$rw[x]$指x(已经转化为数字的字母)所代表的真正数字,$vis[x]$表示$x$有没有被使用过,$inc[i]$表示第$i$列有没有进位。

    $90pts$

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<cctype>
    #include<cstdlib>
    #include<iomanip>
    #include<vector>
    #include<map>
    #include<set>
    #define ll long long
    #define R register int
    static char B[1<<8],*S=B,*D=B;
    #define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<8,stdin),S==D)?EOF:*S++)
    using namespace std;
    inline int g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    }
    inline void gs(int* c) {
        register char ch; while(!isalpha(ch=getchar()));
        do *++c=int(ch-'A'); while(isalpha(ch=getchar())); 
    } int n,rw[27],s[4][27],inc[27];
    bool vis[27];
    inline void dfs(int x) { 
        if(x==0) {for(R i=0;i<n;++i) printf("%d ",rw[i]); exit(0);} //print();
        if(rw[s[1][x]]==-1) {
            for(R i=n-1;i>=0;--i) if(!vis[i]) {
                    rw[s[1][x]]=i,vis[i]=true; 
                    if(rw[s[2][x]]==-1) {
                        for(R j=0;j<n;++j) if(!vis[j]){
                            rw[s[2][x]]=j,vis[j]=true;
                            if(rw[s[3][x]]==-1) {
                                rw[s[3][x]]=(rw[s[1][x]]+rw[s[2][x]]+inc[x]);
                                if(rw[s[3][x]]>=n) rw[s[3][x]]%=n,inc[x-1]=1;
                                if(vis[rw[s[3][x]]]) {rw[s[3][x]]=-1; inc[x-1]=0; goto ed2;}
                                vis[rw[s[3][x]]]=true; dfs(x-1); inc[x-1]=0; vis[rw[s[3][x]]]=false; rw[s[3][x]]=-1; 
                            } else {
                                if(rw[s[3][x]]==(rw[s[1][x]]+rw[s[2][x]]+inc[x])%n) inc[x-1]=(rw[s[1][x]]+rw[s[2][x]]+inc[x])/n,dfs(x-1),inc[x-1]=0;
                            }
                            ed2: rw[s[2][x]]=-1,vis[j]=false;
                        } 
                    } else {
                        if(rw[s[3][x]]==-1) {
                            rw[s[3][x]]=(rw[s[1][x]]+rw[s[2][x]]+inc[x]);
                            if(rw[s[3][x]]>=n) rw[s[3][x]]%=n,inc[x-1]=1;
                            if(vis[rw[s[3][x]]]) {rw[s[3][x]]=-1; inc[x-1]=0; goto enddd;}
                            vis[rw[s[3][x]]]=true; dfs(x-1); inc[x-1]=0; vis[rw[s[3][x]]]=false; rw[s[3][x]]=-1; 
                        } else { 
                            if(rw[s[3][x]]==(rw[s[1][x]]+rw[s[2][x]]+inc[x])%n) inc[x-1]=(rw[s[1][x]]+rw[s[2][x]]+inc[x])/n,dfs(x-1),inc[x-1]=0;
                            else {inc[x-1]=0; }
                        } enddd:;
                    } rw[s[1][x]]=-1,vis[i]=false;
            } 
        } else {
            if(rw[s[2][x]]==-1) { 
                for(R j=n-1;j>=0;--j) if(!vis[j]) {
                    rw[s[2][x]]=j,vis[j]=true;
                    if(rw[s[3][x]]==-1) {
                        rw[s[3][x]]=(rw[s[1][x]]+rw[s[2][x]]+inc[x]);
                        if(rw[s[3][x]]>=n) rw[s[3][x]]%=n,inc[x-1]=1;
                        if(vis[rw[s[3][x]]]) {rw[s[3][x]]=-1; inc[x-1]=0; goto ed21;}
                        vis[rw[s[3][x]]]=true; dfs(x-1); inc[x-1]=0; vis[rw[s[3][x]]]=false; rw[s[3][x]]=-1; 
                    } else {
                        if(rw[s[3][x]]==(rw[s[1][x]]+rw[s[2][x]]+inc[x])%n) inc[x-1]=(rw[s[1][x]]+rw[s[2][x]]+inc[x])/n,dfs(x-1),inc[x-1]=0;
                    } ed21: vis[j]=false;
                } rw[s[2][x]]=-1;
            } else {
                if(rw[s[3][x]]==-1) {
                    rw[s[3][x]]=(rw[s[1][x]]+rw[s[2][x]]+inc[x]);
                    if(rw[s[3][x]]>=n) rw[s[3][x]]%=n,inc[x-1]=1;
                    if(vis[rw[s[3][x]]]) {rw[s[3][x]]=-1; inc[x-1]=0; goto end;}
                    vis[rw[s[3][x]]]=true; dfs(x-1); inc[x-1]=0; vis[rw[s[3][x]]]=false; rw[s[3][x]]=-1; 
                } else {
                    if(rw[s[3][x]]==(rw[s[1][x]]+rw[s[2][x]]+inc[x])%n) inc[x-1]=(rw[s[1][x]]+rw[s[2][x]]+inc[x])/n,dfs(x-1),inc[x-1]=0;
                } end:;
            }
        }
    }
    
    signed main() {
        n=g(); for(R i=1;i<=3;++i) gs(s[i]);
        memset(rw,0xff,sizeof(rw)); dfs(n);
    }

    $100pts$

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<cctype>
    #include<cstdlib>
    #include<iomanip>
    #include<vector>
    #include<map>
    #include<set>
    #define ll long long
    #define R register int
    static char B[1<<8],*S=B,*D=B;
    #define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<8,stdin),S==D)?EOF:*S++)
    using namespace std;
    inline int g() {
        R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;
        do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
    }
    inline void gs(int* c) {
        register char ch; while(!isalpha(ch=getchar()));
        do *++c=int(ch-'A'); while(isalpha(ch=getchar())); 
    } int n,rw[27],s[4][27],inc[27];
    bool vis[27];
    inline bool ck() {
        for(R i=1;i<=n;++i) {
            if(rw[s[1][i]]!=-1&&(rw[s[2][i]])!=-1&&(rw[s[3][i]])!=-1)  {
                if(((rw[s[1][i]])+(rw[s[2][i]])+1)%n!=(rw[s[3][i]])&&((rw[s[1][i]])+(rw[s[2][i]]))%n!=rw[s[3][i]]) return false;
            } 
        } return true;
    }
    inline void dfs(int x) { 
        if(x==0) if(!inc[0]){for(R i=0;i<n;++i) printf("%d ",rw[i]); exit(0);} //print();
            else return ;
        if(rw[s[1][x]]==-1) {
            for(R i=n-1;i>=0;--i) if(!vis[i]) {
                    rw[s[1][x]]=i,vis[i]=true; 
                    if(rw[s[2][x]]==-1) {
                        for(R j=0;j<n;++j) if(!vis[j]){
                            rw[s[2][x]]=j,vis[j]=true;
                            if(rw[s[3][x]]==-1) {
                                rw[s[3][x]]=(rw[s[1][x]]+rw[s[2][x]]+inc[x]);
                                if(rw[s[3][x]]>=n) rw[s[3][x]]%=n,inc[x-1]=1;
                                if(vis[rw[s[3][x]]]||!ck()) {rw[s[3][x]]=-1; inc[x-1]=0; goto ed2;}
                                vis[rw[s[3][x]]]=true; dfs(x-1); inc[x-1]=0; vis[rw[s[3][x]]]=false; rw[s[3][x]]=-1; 
                            } else {
                                if(rw[s[3][x]]==(rw[s[1][x]]+rw[s[2][x]]+inc[x])%n&&ck()) inc[x-1]=(rw[s[1][x]]+rw[s[2][x]]+inc[x])/n,dfs(x-1),inc[x-1]=0;
                            }
                            ed2: rw[s[2][x]]=-1,vis[j]=false;
                        } 
                    } 
                    else {
                        if(rw[s[3][x]]==-1) {
                            rw[s[3][x]]=(rw[s[1][x]]+rw[s[2][x]]+inc[x]);
                            if(rw[s[3][x]]>=n) rw[s[3][x]]%=n,inc[x-1]=1;
                            if(vis[rw[s[3][x]]]||!ck()) {rw[s[3][x]]=-1; inc[x-1]=0; goto enddd;}
                            vis[rw[s[3][x]]]=true; dfs(x-1); inc[x-1]=0; vis[rw[s[3][x]]]=false; rw[s[3][x]]=-1; 
                        } else { 
                            if(rw[s[3][x]]==(rw[s[1][x]]+rw[s[2][x]]+inc[x])%n&&ck()) inc[x-1]=(rw[s[1][x]]+rw[s[2][x]]+inc[x])/n,dfs(x-1),inc[x-1]=0;
                            else {inc[x-1]=0; }
                        } enddd:;
                    } rw[s[1][x]]=-1,vis[i]=false;
            } 
        } else {
            if(rw[s[2][x]]==-1) { 
                for(R j=n-1;j>=0;--j) if(!vis[j]) {
                    rw[s[2][x]]=j,vis[j]=true;
                    if(rw[s[3][x]]==-1) {
                        rw[s[3][x]]=(rw[s[1][x]]+rw[s[2][x]]+inc[x]);
                        if(rw[s[3][x]]>=n) rw[s[3][x]]%=n,inc[x-1]=1;
                        if(vis[rw[s[3][x]]]||!ck()) {rw[s[3][x]]=-1; inc[x-1]=0; goto ed21;}
                        vis[rw[s[3][x]]]=true; dfs(x-1); inc[x-1]=0; vis[rw[s[3][x]]]=false; rw[s[3][x]]=-1; 
                    } else {
                        if(rw[s[3][x]]==(rw[s[1][x]]+rw[s[2][x]]+inc[x])%n&&ck()) inc[x-1]=(rw[s[1][x]]+rw[s[2][x]]+inc[x])/n,dfs(x-1),inc[x-1]=0;
                    } ed21: vis[j]=false;
                } rw[s[2][x]]=-1;
            } else {
                if(rw[s[3][x]]==-1) {
                    rw[s[3][x]]=(rw[s[1][x]]+rw[s[2][x]]+inc[x]);
                    if(rw[s[3][x]]>=n) rw[s[3][x]]%=n,inc[x-1]=1;
                    if(vis[rw[s[3][x]]]||!ck()) {rw[s[3][x]]=-1; inc[x-1]=0; goto end;}
                    vis[rw[s[3][x]]]=true; dfs(x-1); inc[x-1]=0; vis[rw[s[3][x]]]=false; rw[s[3][x]]=-1; 
                } else {
                    if(rw[s[3][x]]==(rw[s[1][x]]+rw[s[2][x]]+inc[x])%n&&ck()) inc[x-1]=(rw[s[1][x]]+rw[s[2][x]]+inc[x])/n,dfs(x-1),inc[x-1]=0;
                } end:;
            }
        }
    }
    
    signed main() {
    #ifdef JACK
        freopen("NOIPAK++.in","r",stdin);
    #endif
        n=g(); for(R i=1;i<=3;++i) gs(s[i]);
        memset(rw,0xff,sizeof(rw)); dfs(n);
    }

    2019.06.06

  • 相关阅读:
    ASP.NET之电子商务系统开发1(数据列表)
    ASP.NET之电子商务系统开发2(购物车功能)
    MFC之列表控件
    自己动手写操作系统(二)一个最小的“操作系统”
    自己动手写操作系统(一)环境准备
    windows常用快捷键
    MFC之下拉框
    链表反转&交换链表结点
    TinyHttp前置知识
    单链表基本操作总结
  • 原文地址:https://www.cnblogs.com/Jackpei/p/10986931.html
Copyright © 2011-2022 走看看