解题报告: 和POJ 3074是一样的,稍微改下代码即可。代码如下:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int M=1024*110; const int N=1024; int l[M], r[M], d[M], u[M], col[M], row[M], h[N], control[N]; int dcnt = 0; char str[111]; inline void addnode(int &x) { ++x; r[x]=l[x]=u[x]=d[x]=x; } inline void insert_row(int rowx, int x) { r[l[rowx]]=x; l[x]=l[rowx]; r[x]=rowx; l[rowx]=x; } inline void insert_col(int colx, int x) { d[u[colx]]=x; u[x]=u[colx]; d[x]=colx; u[colx]=x; } void dlx_init(int cols) { memset(h, -1, sizeof(h)); memset(control, 0, sizeof(control)); dcnt=-1; addnode(dcnt); for(int i=1;i<=cols;++i) { addnode(dcnt); insert_row(0, dcnt); } } void remove(int c) { l[r[c]]=l[c]; r[l[c]]=r[c]; for(int i=d[c];i!=c;i=d[i]) for(int j=r[i];j!=i;j=r[j]) { u[d[j]]=u[j]; d[u[j]]=d[j]; control[col[j]]--; } } void resume(int c) { for(int i=u[c];i!=c;i=u[i]) for(int j=l[i];j!=i;j=l[j]) { u[d[j]]=j; d[u[j]]=j; control[col[j]]++; } l[r[c]]=c; r[l[c]]=c; } bool DLX(int deep) { if(r[0]==0) { for(int i=0;i<9;i++) { for(int j=0;j<9;j++) printf("%c", str[i*9+j]); puts(""); } return true; } int min=M, tempc; for(int i=r[0];i!=0;i=r[i]) if(control[i]<min) { min=control[i]; tempc=i; } remove(tempc); for(int i=d[tempc];i!=tempc;i=d[i]) { str[row[i]/9]=row[i]%9+'1'; for(int j=r[i];j!=i;j=r[j]) remove(col[j]); if(DLX(deep+1)) return true; for(int j=l[i];j!=i;j=l[j]) resume(col[j]); } resume(tempc); return false; } inline void insert_node(int x, int y) { control[y]++; addnode(dcnt); row[dcnt]=x; col[dcnt]=y; insert_col(y, dcnt); if(h[x]==-1) h[x]=dcnt; else insert_row(h[x], dcnt); } int main() { #ifdef ACM freopen("in.txt", "r", stdin); #endif int T; scanf("%d", &T); while(T--) { for(int i=0;i<9;i++) scanf("%s", str+9*i); dlx_init(4*9*9); for(int i=1;i<=9;i++) for(int j=1;j<=9;j++) { for(int k=1;k<=9;k++) if(str[(i-1)*9+(j-1)]=='0' || str[(i-1)*9+(j-1)]=='0'+k) { int rr=(i-1)*9*9+(j-1)*9+(k-1); insert_node(rr, 81*0+(i-1)*9+k); insert_node(rr, 81*1+(j-1)*9+k); insert_node(rr, 81*2+((i-1)/3+(j-1)/3*3)*9+k); insert_node(rr, 81*3+(i-1)*9+j); } } DLX(0); } }