【HDU】4210 Su-domino-ku

  1 #include<cstdio>

  2 #include<cstring>

  3 #include<algorithm>

  4 #define MAXN 300000

  5 #define MAXL 1010

  6 #define MAXM 10

  7 #define INF 0x7FFFFFFF

  8 using namespace std;

  9 int L[MAXN], R[MAXN], U[MAXN], D[MAXN];

 10 int S[MAXL], H[MAXL], C[MAXN], X[MAXN], Q[MAXL];

 11 bool vis[MAXM][MAXM], G[MAXM][MAXM], has[MAXL];

 12 int size, row, a[MAXM][MAXM];

 13 int go[4][2] = { 0, 1, 0, -1, 1, 0, -1, 0 };

 14 void Init(int n, int m) {

 15     int i;

 16     memset(vis, false, sizeof(vis));

 17     memset(has, false, sizeof(has));

 18     memset(a, 0, sizeof(a));

 19     memset(G, false, sizeof(G));

 20     for (i = 0; i <= n; i++)

 21         H[i] = -1;

 22     for (i = 0; i <= m; i++) {

 23         L[i + 1] = i;

 24         R[i] = i + 1;

 25         U[i] = D[i] = i;

 26         S[i] = 0;

 27     }

 28     R[m] = 0;

 29     size = m + 1;

 30 }

 31 void Link(int r, int c) {

 32     U[size] = c;

 33     D[size] = D[c];

 34     U[D[c]] = size;

 35     D[c] = size;

 36     if (H[r] < 0)

 37         H[r] = L[size] = R[size] = size;

 38     else {

 39         L[size] = H[r];

 40         R[size] = R[H[r]];

 41         L[R[H[r]]] = size;

 42         R[H[r]] = size;

 43     }

 44     S[c]++;

 45     X[size] = r;

 46     C[size++] = c;

 47 }

 48 void Remove(int c) {

 49     int i, j;

 50     L[R[c]] = L[c];

 51     R[L[c]] = R[c];

 52     for (i = D[c]; i != c; i = D[i]) {

 53         for (j = R[i]; j != i; j = R[j]) {

 54             U[D[j]] = U[j];

 55             D[U[j]] = D[j];

 56             S[C[j]]--;

 57         }

 58     }

 59 }

 60 void Resume(int c) {

 61     int i, j;

 62     L[R[c]] = R[L[c]] = c;

 63     for (i = D[c]; i != c; i = D[i]) {

 64         for (j = R[i]; j != i; j = R[j]) {

 65             U[D[j]] = D[U[j]] = j;

 66             S[C[j]]++;

 67         }

 68     }

 69 }

 70 bool DFS(int now) {

 71     if (now > 81)

 72         return true;

 73     int x, y, nx, ny, i;

 74     x = (now - 1) / 9 + 1;

 75     y = now - (x - 1) * 9;

 76     if (vis[x][y])

 77         return DFS(now + 1);

 78     vis[x][y] = true;

 79     for (i = 0; i < 4; i++) {

 80         nx = x + go[i][0];

 81         ny = y + go[i][1];

 82         if (nx > 0 && nx < 10 && ny > 0 && ny < 10 && !vis[nx][ny]

 83                 && !G[a[x][y]][a[nx][ny]]) {

 84             vis[nx][ny] = true;

 85             G[a[x][y]][a[nx][ny]] = G[a[nx][ny]][a[x][y]] = true;

 86             if (DFS(now + 1))

 87                 return true;

 88             G[a[x][y]][a[nx][ny]] = G[a[nx][ny]][a[x][y]] = false;

 89             vis[nx][ny] = false;

 90         }

 91     }

 92     vis[x][y] = false;

 93     return false;

 94 }

 95 bool Dance() {

 96     int i, j, k, temp, c;

 97     if (R[0] == 0) {

 98         for (i = j = k = 1; i < row; i++) {

 99             if (has[i]) {

100                 a[j][k] = Q[i];

101                 k++;

102                 if (k > 9) {

103                     k = 1;

104                     j++;

105                 }

106             }

107         }

108         if (DFS(1)) {

109             for (i = 1; i < 10; i++) {

110                 for (j = 1; j < 10; j++)

111                     printf("%d", a[i][j]);

112                 putchar('\n');

113             }

114             return true;

115         }

116         return false;

117     }

118     for (temp = INF, i = R[0]; i; i = R[i]) {

119         if (temp > S[i]) {

120             temp = S[i];

121             c = i;

122         }

123     }

124     Remove(c);

125     for (i = D[c]; i != c; i = D[i]) {

126         has[X[i]] = true;

127         for (j = R[i]; j != i; j = R[j])

128             Remove(C[j]);

129         if (Dance())

130             return true;

131         for (j = L[i]; j != i; j = L[j])

132             Resume(C[j]);

133         has[X[i]] = false;

134     }

135     Resume(c);

136     return false;

137 }

138 int main() {

139     int ca = 1;

140     int n, i, j, k, x1, x2;

141     char y1, z1, y2, z2;

142     while (scanf("%d", &n), n) {

143         Init(729, 324);

144         for (i = 0; i < n; i++) {

145             scanf("%d %c %c %d %c %c", &x1, &y1, &z1, &x2, &y2, &z2);

146             y1 -= 'A' - 1;

147             z1 -= '0';

148             y2 -= 'A' - 1;

149             z2 -= '0';

150             a[y1][z1] = x1;

151             a[y2][z2] = x2;

152             vis[y1][z1] = vis[y2][z2] = true;

153             G[x1][x2] = G[x2][x1] = true;

154         }

155         for (i = 1; i < 10; i++) {

156             scanf(" %c %c", &y1, &y2);

157             y1 -= 'A' - 1;

158             y2 -= '0';

159             a[y1][y2] = i;

160             vis[y1][y2] = true;

161         }

162         for (row = i = 1; i < 10; i++) {

163             for (j = 1; j < 10; j++) {

164                 if (a[i][j]) {

165                     k = a[i][j];

166                     Q[row] = k;

167                     Link(row, (i - 1) * 9 + k);

168                     Link(row, 81 + (j - 1) * 9 + k);

169                     Link(row, 162 + ((i - 1) / 3 * 3 + (j - 1) / 3) * 9 + k);

170                     Link(row, 243 + (i - 1) * 9 + j);

171                     row++;

172                 } else {

173                     for (k = 1; k < 10; k++) {

174                         Q[row] = k;

175                         Link(row, (i - 1) * 9 + k);

176                         Link(row, 81 + (j - 1) * 9 + k);

177                         Link(row,

178                                 162 + ((i - 1) / 3 * 3 + (j - 1) / 3) * 9 + k);

179                         Link(row, 243 + (i - 1) * 9 + j);

180                         row++;

181                     }

182                 }

183             }

184         }

185         printf("Puzzle %d\n", ca++);

186         Dance();

187     }

188     return 0;

189 }

你可能感兴趣的:(dom)