Luogu P1092 虫食算 爆搜??O2好啊

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

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

然后,我$90$~

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

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

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

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

#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);
}

2019.06.06

正解一定写,一定写。。。

猜你喜欢

转载自www.cnblogs.com/Jackpei/p/10986931.html