心路历程:震惊,我竟然得了$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
正解一定写,一定写。。。
原文:https://www.cnblogs.com/Jackpei/p/10986931.html