1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| #include <bits/stdc++.h> using namespace std; const int maxn = 10, dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int n, g[maxn][maxn], v[maxn][maxn];
bool valid(int x, int y) { return x >= 1 && y >= 1 && x <= n && y <= n; }
void dfs(int x, int y, int c) { v[x][y] = 1; for (int i = 0; i < 4; ++i) { int nx = x + dx[i], ny = y + dy[i]; if (!valid(nx, ny)) continue; if (v[nx][ny] == 1) continue; if (g[nx][ny] == c) dfs(nx, ny, c); else v[nx][ny] = 2; } }
int f() { int t[6], res = 0; memset(t, 0, sizeof(t)); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { if (v[i][j] != 1) t[g[i][j]] = 1; } } for (int i = 0; i < 6; ++i) { if (t[i]) ++res; } return res; }
bool dye(int c) { bool flag = false; for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { if (g[i][j] == c && v[i][j] == 2) { dfs(i, j, c); flag = true; } } } return flag; }
bool ida(int depth, int mxdepth) { if (depth + f() > mxdepth) return false; if (!f()) return true; int backup[maxn][maxn]; memcpy(backup, v, sizeof(v)); for (int k = 0; k < 6; ++k) { if (!dye(k)) continue; if (ida(depth + 1, mxdepth)) return true; memcpy(v, backup, sizeof(v)); } return false; }
int main() { while (cin >> n && n) { memset(v, 0, sizeof(v)); for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { cin >> g[i][j]; } } int depth = 0; dfs(1, 1, g[1][1]); while (!ida(0, depth)) ++depth; cout << depth << endl; } return 0; }
|