【POJ】3076 Sudoku
2012-07-24 20:09
190 查看
#include<cstdio> #include<cstring> #define INF 0x7FFFFFFF #define MAXS 16 #define MAXH 4100 #define MAXL 1025 #define MAXN 4200000 char sd[MAXS][MAXS]; int L[MAXN], R[MAXN], U[MAXN], D[MAXN], C[MAXN], X[MAXN]; int size, S[MAXL], H[MAXH], Q[MAXH]; bool vis[MAXH]; bool Read() { int i, j; for (i = 0; i < MAXS; i++) { for (j = 0; j < MAXS; j++) { if (scanf(" %c", &sd[i][j]) == EOF) return false; } } return true; } void Init() { int i; for (i = 0; i < MAXL; i++) { R[i] = i + 1; L[i + 1] = i; U[i] = D[i] = i; S[i] = 0; } R[MAXL - 1] = 0; size = MAXL; } void Remove(int c) { int i, j; L[R[c]] = L[c]; R[L[c]] = R[c]; for (i = D[c]; i != c; i = D[i]) { for (j = R[i]; j != i; j = R[j]) { U[D[j]] = U[j]; D[U[j]] = D[j]; S[C[j]]--; } } } void Resume(int c) { int i, j; L[R[c]] = c; R[L[c]] = c; for (i = D[c]; i != c; i = D[i]) { for (j = R[i]; j != i; j = R[j]) { U[D[j]] = j; D[U[j]] = j; S[C[j]]++; } } } inline void Link(int r, int c) { D[size] = D[c]; U[size] = c; U[D[c]] = size; D[c] = size; if (H[r] < 0) H[r] = L[size] = R[size] = size; else { L[size] = H[r]; R[size] = R[H[r]]; L[R[H[r]]] = size; R[H[r]] = size; } S[c]++; X[size] = r; C[size++] = c; } bool Dance() { if (R[0] == 0) return true; int i, j, temp, c; for (temp = INF,i = R[0]; i; i = R[i]) { if (temp > S[i]) { temp = S[i]; c = i; } } Remove(c); for (i = D[c]; i != c; i = D[i]) { vis[X[i]] = true; for (j = R[i]; j != i; j = R[j]) Remove(C[j]); if (Dance()) return true; for (j = L[i]; j != i; j = L[j]) Resume(C[j]); vis[X[i]] = false; } Resume(c); return false; } int main() { int i, j, k, r; while (Read()) { Init(); for (i = r = 0; i < MAXS; i++) { for (j = 0; j < MAXS; j++) { if (sd[i][j] == '-') { for (k = 0; k < MAXS; k++) { H[++r] = -1; Q[r] = k; Link(r, (i << 4) + k + 1); Link(r, 256 + (j << 4) + k + 1); Link(r, 512 + ((((i >> 2) << 2) + (j >> 2)) << 4) + k + 1); Link(r, 768 + (i << 4) + j + 1); } } else { k = sd[i][j] - 'A'; H[++r] = -1; Q[r] = k; Link(r, (i << 4) + k + 1); Link(r, 256 + (j << 4) + k + 1); Link(r, 512 + ((((i >> 2) << 2) + (j >> 2)) << 4) + k + 1); Link(r, 768 + (i << 4) + j + 1); } } } memset(vis, false, sizeof(vis)); Dance(); for (k = 0, i = 1; i <= r; i++) { if (vis[i]) { k++; putchar('A' + Q[i]); if (k % 16 == 0) putchar('\n'); } } putchar('\n'); } return 0; }
相关文章推荐
- POJ 3076 Sudoku (dancing links)
- POJ 3076 / ZOJ 3122 Sudoku(DLX)
- POJ 3076 Sudoku DLX精确覆盖
- POJ 3076 Sudoku (dancing links)
- POJ 3076 Sudoku (DLX解数独)
- LA_2659_POJ_3076_ZOJ_3122_Sudoku(DancingLinksX精确覆盖,数独题模板)
- POJ 3076 Sudoku DLX精确覆盖
- 【Dancing Links舞蹈链】poj 3076 Sudoku
- poj 3076 Sudoku 数独(16*16)+精确覆盖+DLX 只输出一组解
- LA 2659 && poj 3076 && zoj 3122 Sudoku(精确覆盖 + DLX)
- DLX(精确覆盖) 16*16数独 POJ 3076 Sudoku
- POJ 3076 Sudoku 笔记
- POJ 3076 Sudoku 解题报告(Dancing Link)
- poj 3076 Sudoku //Dancing Links
- POJ-3076 Sudoku(Dancing Link 算法)
- POJ 3076 Sudoku 数独模板
- POJ 3076 Sudoku
- POJ 3076 Sudoku【DancingLinks,数独】
- POJ 3076 Sudoku
- POJ 3076 Sudoku 精确覆盖问题DLX