#include #include #include #include #include #include #include using namespace std; const int Dx[] = {-1, 0, 1, 0}, Dy[] = {0, -1, 0, 1}; const int INF = 0x3f3f3f3f; const int N = 14; char A[50][20][20]; bool S[20][20]; int dist[402], daux[402], dnow[402]; int size[402], mx[402], my[402]; int ST[402], result[402], aux[402]; int comp[20][20], compnow; int colcomp[402]; queue Q; int colnow; void fill(int x, int y, int cmpnow) { if (x < 1 || y < 1 || x > 14 || y > 14 || comp[x][y] || A[result[0]][x][y] - '0' != colnow) return; comp[x][y] = cmpnow; mx[cmpnow] += x; my[cmpnow] += y; ++size[cmpnow]; for (int i = 0; i < 4; ++i) fill(x + Dx[i], y + Dy[i], cmpnow); } void getdist(int now) { for (int i = 1; i <= compnow; ++i) dist[i] = INF; dist[now] = 0; Q.push(now); while (!Q.empty()) { int now = Q.front(); Q.pop(); for (int i = 1; i <= 14; ++i) for (int j = 1; j <= 14; ++j) if (comp[i][j] == now) for (int k = 0; k < 4; ++k) if (i + Dx[k] >= 1 && i + Dx[k] <= 14 && j + Dy[k] >= 1 && j + Dy[k] <= 14) if (dist[comp[i + Dx[k]][j + Dy[k]]] == INF) { dist[comp[i + Dx[k]][j + Dy[k]]] = dist[now] + 1; Q.push(comp[i + Dx[k]][j + Dy[k]]); } } } void greedy() { while (true) { memset(comp, 0, sizeof(comp)); memset(size, 0, sizeof(size)); memset(mx, 0, sizeof(mx)); memset(my, 0, sizeof(my)); memset(colcomp, 0, sizeof(colcomp)); compnow = 0; for (int i = 1; i <= N; ++i) for (int j = 1; j <= N; ++j) if (!comp[i][j]) { colnow = A[result[0]][i][j] - '0'; fill(i, j, ++compnow); colcomp[compnow] = colnow; } getdist(1); memcpy(daux, dist, sizeof(daux)); memset(dnow, 0, sizeof(dnow)); bool any = false; for (int i = 1; i <= compnow; ++i) if (daux[i] == 1) { any = true; getdist(i); for (int j = 1; j <= compnow; ++j) dnow[i] = max(dnow[i], dist[j]); } if (!any) break; int cand = 0; for (int i = 1; i <= compnow; ++i) if (daux[i] == 1 && (cand == 0 || dnow[i] <= dnow[cand])) cand = i; result[++result[0]] = colcomp[cand]; for (int i = 1; i <= N; ++i) for (int j = 1; j <= N; ++j) { A[result[0]][i][j] = A[result[0] - 1][i][j]; if (daux[comp[i][j]] == 0) A[result[0]][i][j] = result[result[0]] + '0'; } } } int main() { cin.sync_with_stdio(false); for (int i = 1; i <= N; ++i) cin >> (A[0][i] + 1); greedy(); memcpy(aux, result, sizeof(aux)); while (aux[0] > 25) { int where = rand() % 25 + 1; memcpy(result, aux, sizeof(result)); for (int i = 0; i < 6; ++i) if (i != aux[where]) { result[0] = where; result[where] = i; char oldcol = A[result[0] - 1][1][1], newcol = A[result[0]][1][1]; for (int i = 1; i <= N; ++i) for (int j = 1; j <= N; ++j) if (A[result[0] - 1][i][j] == oldcol && A[result[0]][i][j] == newcol) A[result[0]][i][j] = result[result[0]] + '0'; greedy(); if (result[0] < aux[0]) memcpy(aux, result, sizeof(aux)); } memcpy(result, aux, sizeof(result)); result[0] = where; greedy(); } for (int i = 1; i <= aux[0]; ++i) cout << aux[i] << ' '; cout << '\n'; }