1
1
// Sudoku Solver
2
+ // / exact cover problem
2
3
#define REP (i, n ) for (int i = 0 ; i < (n); i++)
3
4
4
5
class Solution {
5
6
private:
6
- static const int N = 9 , MAXR = N*N*N, MAXC = N*N*4 , M = MAXC+1 +MAXR*4 ;
7
- int L[M], R[M], U[M], D[M], col[M], size[M], res[N*N];
8
- pair<int , int > mean[M];
7
+ static const int N = 9 , MAXC = N*N*4 , M = MAXC+1 +N*N*N*4 ;
8
+ int L[M], R[M], U[M], D[M], col[M], size[M], mean[M];
9
9
void cover (int c) {
10
10
L[R[c]] = L[c];
11
11
R[L[c]] = R[c];
@@ -21,7 +21,7 @@ class Solution {
21
21
U[D[j]] = D[U[j]] = j;
22
22
L[R[c]] = R[L[c]] = c;
23
23
}
24
- void insert (int i, int l, int r, int c) {
24
+ void append (int i, int l, int r, int c) {
25
25
L[i] = l; R[i] = r;
26
26
D[U[i] = U[c]] = i;
27
27
U[D[i] = c] = i;
@@ -39,7 +39,7 @@ class Solution {
39
39
for (int i = D[c]; i != c; i = D[i]) {
40
40
for (int j = R[i]; j != i; j = R[j])
41
41
cover (col[j]);
42
- a[mean[i]. first / 9 ][mean[i]. first % 9 ] = ' 1' +mean[i]. second ;
42
+ a[mean[i]/N/N ][mean[i]/N%N ] = ' 1' +mean[i]%N ;
43
43
if (dlx (a)) return true ;
44
44
for (int j = L[i]; j != i; j = L[j])
45
45
uncover (col[j]);
@@ -67,11 +67,11 @@ class Solution {
67
67
hi = 9 ;
68
68
}
69
69
for (int k = lo; k < hi; k++) {
70
- pair< int , int > me = make_pair ( i*N+j, k);
71
- insert (cur, cur+ 3 , cur+1 , i *N+k); mean[cur] = me ;
72
- insert (cur+1 , cur, cur+2 , N*N+j *N+k); mean[cur+ 1 ] = me ;
73
- insert (cur+2 , cur+1 , cur+ 3 , N*N*2 +i*N+j); mean[cur+ 2 ] = me ;
74
- insert (cur+ 3 , cur+ 2 , cur, N*N* 3 +(i/ 3 * 3 +j/ 3 )*N+k); mean[cur+ 3 ] = me ;
70
+ append (cur, cur+ 3 , cur+ 1 , i*N+k);
71
+ append (cur+ 1 , cur, cur+2 , N *N+j*N+k) ;
72
+ append (cur+2 , cur+ 1 , cur+3 , N*N* 2 +i *N+j) ;
73
+ append (cur+3 , cur+2 , cur, N*N*3 +(i/ 3 * 3 +j/ 3 )*N+k) ;
74
+ fill_n (mean+ cur, 4 , (i*N+j )*N+k);
75
75
cur += 4 ;
76
76
}
77
77
}
0 commit comments