아 나
스도쿠 한번 풀기 더럽게 빡치네
이게 얼마나 걸린거야 -_-
스도쿠 한번 풀기 더럽게 빡치네
이게 얼마나 걸린거야 -_-
#include지금쯤 훈련소를 나왔을 지군에게 이 코드를 바침 -_-#include #define SIBAL 750 #define CIBAL 350 #define V SIBAL*CIBAL int U[V], D[V]; int L[V], R[V]; int C[V], ROW[V]; int H[SIBAL], S[CIBAL]; int size; char s[10][10]; int nimiral1[SIBAL], nimiral2[SIBAL], OK[87]; char nimhi[SIBAL]; void Link(int r, int c) { S[c]++ ; C[size] = c; ROW[size] = r; U[size] = U[c]; D[U[c]] = size; D[size] = c; U[c] = size; if (H[r] == - 1) { H[r] = L[size] = R[size] = size; } else { L[size] = L[H[r]]; R[L[H[r]]] = size; R[size] = H[r]; L[H[r]] = size; } size++ ; } 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]) { S[C[j]]-- ; U[D[j]] = U[j]; D[U[j]] = D[j]; } } } void resume(int c) { int i, j; for (i = U[c]; i != c; i = U[i]) { for (j = L[i]; j != i; j = L[j]) { S[C[j]]++ ; U[D[j]] = D[U[j]] = j; } } R[L[c]] = L[R[c]] = c; } int Jotto(int k) { int i, j, Min, c; if (!R[0]) { return 1; } for (Min = SIBAL, i = R[0]; i; i = R[i]) { if (Min > S[i]) { Min = S[i]; c = i; } } remove(c); for (i = D[c]; i != c; i = D[i]) { for (j = R[i]; j != i; j = R[j]) { remove(C[j]); } OK[k] = ROW[i]; if (Jotto(k + 1)) { return 1; } for (j = L[i]; j != i; j = L[j]) { resume(C[j]); } } resume(c); return 0; } int main() { int i, j, k, r; char st[87]; while (gets(st)) { if (st[0] == 'e') { break; } i = 0; for (j = 1; j <= 9; j++) { for (k = 1; k <= 9; k++) { s[j][k] = st[i++]; } } for (i = 0; i <= 324; i++) { S[i] = 0; D[i] = U[i] = i; L[i + 1] = i; R[i] = i + 1; } R[324] = 0; size = 325; r = 0; memset(H, - 1, sizeof(H)); for (i = 1; i <= 9; i++) { for (j = 1; j <= 9; j++) { if (s[i][j] != '.') { r++ ; nimiral1[r] = i; nimiral2[r] = j; nimhi[r] = s[i][j]; Link(r, (i - 1)*9 + j); Link(r, 81 + (i - 1)*9 + s[i][j] - '0'); Link(r, 162 + (j - 1)*9 + s[i][j] - '0'); Link(r, 243 + ((i - 1)/3)*27 + ((j - 1)/3)*9 + s[i][j] - '0'); } else { for (k = 1; k <= 9; k++) { r++ ; nimiral1[r] = i; nimiral2[r] = j; nimhi[r] = k + '0'; Link(r, (i - 1)*9 + j); Link(r, 81 + (i - 1)*9 + k); Link(r, 162 + (j - 1)*9 + k); Link(r, 243 + ((i - 1)/3)*27 + ((j - 1)/3)*9 + k ); } } } } Jotto(0); for (i = 0; i<81; i++) { s[nimiral1[OK[i]]][nimiral2[OK[i]]] = nimhi[OK[i]]; } for (i = 1; i<= 9; i++) { for (j = 1; j <= 9; j++) { printf("%d", s[i][j] - '0'); } } puts(""); } return 0; }
'Solutions > Dlbo's Solution' 카테고리의 다른 글
PKU 3364. Black and white painting. AC get~ (0) | 2011.04.09 |
---|---|
UVa 628. Passwords. AC g~e~t~ (0) | 2011.04.06 |
PKU 3132. Sum of Different primes. AC get -_- (0) | 2011.03.19 |
PKU 2291. Rotten Ropes. AC get -_-! (0) | 2011.03.14 |
PKU 2181. Jumping Cows -_- AC get (2) | 2011.03.06 |