#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int M = 100005; const int N = 16; struct DLX{ int D[M], U[M], R[M], L[M], head[5000], S[5000], col[M], row[M]; int ans[5025]; int sz, ansd; void init(int tn){ sz = tn; for(int i = 0; i <= tn; i ++) { D[i] = U[i] = i; L[i] = i-1; R[i] = i+1; } L[0] = tn; R[tn] = 0; memset(S, 0, sizeof(S)); memset(head, -1, sizeof(head)); head[0] = 0; } void Insert(int r, int c){ ++S[col[++sz] = c]; row[sz] = r; D[sz] = D[c]; U[D[c]] = sz; U[sz] = c; D[c] = sz; if(head[r] < 0) head[r] = L[sz] = R[sz] = sz; else{ R[sz] = R[head[r]]; L[R[head[r]]] = sz; L[sz] = head[r]; R[head[r]] = sz; } } 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]; --S[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]) ++S[col[U[D[j]] = D[U[j]]=j]]; } L[R[c]] = R[L[c]] = c; } bool Dance(int d){ if(R[0] == 0){ ansd = d; return true; } int c = R[0]; for(int i = R[0]; i != 0; i = R[i]) if(S[i] < S[c]) c = i; remove(c); for(int i = D[c]; i != c; i = D[i]){ ans[d] = row[i]; for(int j = R[i]; j != i; j = R[j]) { remove(col[j]); } if(Dance(d+1)) return true; for(int j = L[i]; j != i; j = L[j]) resume(col[j]); } resume(c); return false; } } g; char s[17][18]; void print(){ for(int i = 0; i < g.ansd; i ++){ g.ans[i] --; int num = g.ans[i] % N; int y = g.ans[i]/N%N; int x = g.ans[i] /N/N; s[x][y] = num + ‘A‘; } for(int i = 0; i < N; i ++) printf("%s\n", s[i]); } int main(){ int f = 1; while(scanf("%s", s[0]) != EOF){ if(f) f = 0; else printf("\n"); for(int i = 1; i < N; i ++) scanf("%s", s[i]); g.init(1024); for(int i = 0; i < N; i ++){ for(int j = 0; j < N; j ++){ for(int o = 0; o < N; o ++){ if(s[i][j] == ‘-‘ || s[i][j] == ‘A‘ + o){ g.Insert((i*N+j)*N+o+1, i*N+j+1); g.Insert((i*N+j)*N+o+1, N*N+o+i*N+1); g.Insert((i*N+j)*N+o+1, N*N*2+o+j*N+1); g.Insert((i*N+j)*N+o+1, N*N*3+o+((i/4)*4+j/4)*N+1); } } } } bool flag = g.Dance(0) ; print(); } return 0; }
原文:http://www.cnblogs.com/acmood/p/4451982.html