【POJ】3074 Sudoku
2012-07-24 10:36
330 查看
#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]; bool Read() { int i, j; for (i = 1; i < MAXM; i++) { for (j = 1; j < MAXM; j++) { scanf(" %c", &sd[i][j]); if (sd[i][j] == 'e') return false; } } return true; } 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; while (Read()) { Init(); for (r = 0, i = 1; i < MAXM; i++) { for (j = 1; j < MAXM; j++) { if (sd[i][j] == '.') { 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 (i = 1; i <= r; i++) { if (vis[i]) printf("%d", Q[i]); } putchar('\n'); } return 0; }
相关文章推荐
- POJ 3074 Sudoku
- POJ 3074 3076 Sudoku(Dancing Links)
- POJ 3074 Sudoku 笔记
- POJ 3074 Sudoku(DLX+精确覆盖)
- POJ 3074 Sudoku DLX精确覆盖
- (简单) POJ 3074 Sudoku, DLX+精确覆盖。
- poj 3074 Sudoku
- POJ 3074 Sudoku DLX
- 搜索(DLX): POJ 3074 3076 Sudoku
- poj 3074 Sudoku
- poj 3074 Sudoku
- POJ 3074 Sudoku DLX
- Poj 3074: Sudoku
- POJ 3074 Sudoku【DancingLinks,数独】
- POJ 3074 Sudoku (DLX解经典数独)
- POJ 3074 Sudoku(数独|Dancing Links精确覆盖)
- POJ 3074 Sudoku (DLX)
- POJ 3074 Sudoku 舞蹈链
- POJ 3074 Sudoku
- poj 3074 Sudoku