【POJ】2676 Sudoku
2012-07-24 20:17
225 查看
#include<cstdio> #include<cstring> #define MAXM 10 #define MAXL 324 #define MAXN 240000 #define INF 0x7FFFFFFF char sd[MAXM][MAXM]; int L[MAXN], R[MAXN], U[MAXN], D[MAXN], H[MAXN]; int size, C[MAXN], S[MAXN], X[MAXN], Q[MAXN], vis[MAXL * 3]; void Read() { int i, j; for (i = 1; i < MAXM; i++) { for (j = 1; j < MAXM; j++) scanf(" %c", &sd[i][j]); } } void Init() { int i; for (i = 0; i <= MAXL; i++) { L[i + 1] = i; R[i] = i + 1; U[i] = D[i] = i; S[i] = 0; } R[MAXL] = 0; size = MAXL + 1; } 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(int now) { int i, j, c, temp; if (R[0] == 0) return true; for (temp = INF,i = R[0]; i; i = R[i]) { if (S[i] < temp) { 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(now + 1)) 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, ca; scanf("%d", &ca); while (ca--) { Read(); Init(); for (r = 0, i = 1; i < MAXM; i++) { for (j = 1; j < MAXM; j++) { if (sd[i][j] == '0') { for (k = 1; k < MAXM; k++) { H[++r] = -1; Q[r] = k; Link(r, (i - 1) * 9 + k); Link(r, 81 + (j - 1) * 9 + k); Link(r, 162 + ((i - 1) / 3 * 3 + (j - 1) / 3) * 9 + k); Link(r, 243 + (i - 1) * 9 + j); } } else { H[++r] = -1; k = sd[i][j] - '0'; Q[r] = k; Link(r, (i - 1) * 9 + k); Link(r, 81 + (j - 1) * 9 + k); Link(r, 162 + ((i - 1) / 3 * 3 + (j - 1) / 3) * 9 + k); Link(r, 243 + (i - 1) * 9 + j); } } } memset(vis, false, sizeof(vis)); Dance(0); for (k = 0, i = 1; i <= r; i++) { if (vis[i]) { k++; printf("%d", Q[i]); if (k % 9 == 0) putchar('\n'); } } } return 0; }
相关文章推荐
- POJ 2676 Sudoku (搜索,Dancing Links)
- POJ-2676-Sudoku
- poj2676——Sudoku(深度搜索)
- POJ-2676-Sudoku-DFS
- 数独问题的介绍及POJ 2676-Sudoku(dfs+剪枝)
- POJ 2676 Sudoku
- POJ 2676 Sudoku 解题报告(Dancing Link)
- poj(2676)——Sudoku
- POJ 2676 Sudoku (DFS)
- ACM篇:POJ 2676 -- Sudoku
- POJ 2676 Sudoku(dfs)
- poj 2676 Sudoku
- POJ --- 2676 Sudoku
- POJ 2676 Sudoku
- POJ 2676 Sudoku [暴搜]
- POJ - 2676 Sudoku 题解
- poj 2676 Sudoku(dfs填数)
- [DFS]poj 2676 Sudoku 数独问题
- POJ-2676 Sudoku(DFS)
- POJ-2676-Sudoku