【HDU】2780 Su-Su-Sudoku
2012-07-24 20:18
369 查看
#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)); if (Dance(0)) { for (k = 0, i = 1; i <= r; i++) { if (vis[i]) { k++; printf("%d", Q[i]); if (k % 9 == 0) putchar('\n'); } } } else puts("Could not complete this grid."); if (ca) putchar('\n'); } return 0; }
相关文章推荐
- hdu 2780 Su-Su-Sudoku (dfs解的数独)
- 【HDU】2780 Su-Su-Sudoku【数独】精确覆盖
- 【DFS】hdu 2780 Su-Su-Sudoku
- hdu 2780 Su-Su-Sudoku(DFS数独)
- hdu 2780 Su-Su-Sudoku(DFS数独)
- HDU 2780 Su-Su-Sudoku(数独用DLX精确覆盖求解)
- 【HDOJ】2780 Su-Su-Sudoku
- HDU - 1426 Sudoku Killer(DFS)
- HDU 1426--Sudoku Killer【DFS】
- HDU 1426 Sudoku Killer(数独,划分区域是关键)
- [DLX精确覆盖] hdu 4210 Su-domino-ku
- HDU-1426-Sudoku Killer【DFS】
- HDU 1426 Sudoku Killer
- HDU 1426 Sudoku Killer
- hdu Sudoku Killer
- HDU 1426 Sudoku Killer 深搜
- hdu 1426 Sudoku Killer(DFS)
- HDU-1426(Sudoku Killer)(dfs+巧妙思维)
- HDU 1426 Sudoku Killer(BFS)
- 【HDU】3909 Sudoku