Time Limit: 10000MS | Memory Limit: 65536K | |
Total Submissions: 4835 | Accepted: 2298 |
Description
Input
Output
Sample Input
--A----C-----O-I -J--A-B-P-CGF-H- --D--F-I-E----P- -G-EL-H----M-J-- ----E----C--G--- -I--K-GA-B---E-J D-GP--J-F----A-- -E---C-B--DP--O- E--F-M--D--L-K-A -C--------O-I-L- H-P-C--F-A--B--- ---G-OD---J----H K---J----H-A-P-L --B--P--E--K--A- -H--B--K--FI-C-- --F---C--D--H-N-
Sample Output
FPAHMJECNLBDKOGI OJMIANBDPKCGFLHE LNDKGFOIJEAHMBPC BGCELKHPOFIMAJDN MFHBELPOACKJGNID CILNKDGAHBMOPEFJ DOGPIHJMFNLECAKB JEKAFCNBGIDPLHOM EBOFPMIJDGHLNKCA NCJDHBAEKMOFIGLP HMPLCGKFIAENBDJO AKIGNODLBPJCEFMH KDEMJIFNCHGAOPBL GLBCDPMHEONKJIAF PHNOBALKMJFIDCEG IAFJOECGLDPBHMNK
Source
#define N 16*16*16*4+16*16*4+233 #include <string> #include <cstdio> #include <iostream> #include <cstring> using namespace std; struct Queue { int l; int r; int up; int down; int ans; }; Queue f[N]; char s[17][17]; int tot=0,TOT=0,H[17][17],L[17][17],In[17][17],Num[17][17],C[N],Cn[N],ans[17][17],Ans[16*16+1]; void LRlink(int x,int y) { f[x].r=y; f[y].l=x; } void UPlink(int x,int y) { f[x].down=y; f[y].up=x; } int find(int x,int y) { x/=4; y/=4; return(x*4+y); } void Linkline() { LRlink(tot-3,tot-2); LRlink(tot-2,tot-1); LRlink(tot-1,tot); LRlink(tot,tot-3); } void remove(int x) { f[f[x].l].r=f[x].r; f[f[x].r].l=f[x].l; for(int i=f[x].down;i!=x;i=f[i].down) for(int j=f[i].r;j!=i;j=f[j].r) { Cn[C[j]]--; f[f[j].up].down=f[j].down; f[f[j].down].up=f[j].up; } } void resume(int x) { f[f[x].l].r=x; f[f[x].r].l=x; for(int i=f[x].down;i!=x;i=f[i].down) for(int j=f[i].l;j!=i;j=f[j].l) { Cn[C[j]]++; f[f[j].up].down=j; f[f[j].down].up=j; } } void print() { for(int i=0;i<16;i++) printf("%s\n",s[i]); } bool dance(int k) { int c=f[0].r; if(c==0) { print(); return true; } int Min=c; for(int i=c;i!=0;i=f[i].r) if(Cn[Min]>Cn[i]) Min=i; c=Min; remove(c); for(int i=f[c].down;i!=c;i=f[i].down) { int x=f[i].ans/(16*16),y=(f[i].ans/16)%16,z=f[i].ans%16; s[x][y]='A'+z; for(int j=f[i].r;j!=i;j=f[j].r) remove(C[j]); if(dance(k+1)) return true; for(int j=f[i].l;j!=i;j=f[j].l) resume(C[j]); } resume(c); return false; } bool read() { for(int i=0;i<16;i++) if(scanf("%s",s[i])==EOF) return false; return true; } void UPdate(int &x) { UPlink(x,++tot); C[tot]=C[x]; Cn[C[x]]++; x=tot; } void Lianf(int &x) { x=++tot; C[x]=x; } int main() { while(read()) { tot=0; memset(C,0,sizeof(C)); memset(Cn,0,sizeof(Cn)); for(int i=0;i<16;i++) for(int j=0;j<16;j++) { Lianf(H[i][j]); Lianf(L[i][j]); Lianf(In[i][j]); Lianf(Num[i][j]); } //创建表头 for(int i=0;i<tot+1;i++) LRlink(i,(i+1)%(tot+1)); //表头首尾对接 for(int i=0;i<16;i++) for(int j=0;j<16;j++) { char Char; Char=s[i][j]; for(int k=0;k<16;k++) if(Char=='-' || (Char-'A'==k)) { UPdate(H[i][k]); UPdate(L[j][k]); UPdate(In[find(i,j)][k]); UPdate(Num[i][j]); Linkline(); for(int num=tot-3;num<=tot;num++) f[num].ans=i*16*16+j*16+k; } } for(int i=0;i<16;i++) for(int j=0;j<16;j++) { UPlink(H[i][j],C[H[i][j]]); UPlink(L[i][j],C[L[i][j]]); UPlink(In[i][j],C[In[i][j]]); UPlink(Num[i][j],C[Num[i][j]]); } //初始化完毕 dance(1); } }