#include #include #include #include #include #include #include using namespace std; const int D1[] = {-1, 0, 1, 0}, D2[] = {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]; 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 > N || y > N || comp[x][y] || A[result[0]][x][y] - '0' != colnow) return; comp[x][y] = cmpnow; size[cmpnow] += x * y; for (int i = 0; i < 4; ++i) fill(x + D1[i], y + D2[i], cmpnow); } void greedy() { while (true) { memset(comp, 0, sizeof(comp)); memset(size, 0, sizeof(size)); 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; } int whcomp = -1; for (int i = 1; i <= N; ++i) for (int j = 1; j <= N; ++j) if (comp[i][j] == 1) for (int k = 0; k < 4; ++k) if (i + D1[k] >= 1 && i + D1[k] <= N && j + D2[k] >= 1 && j + D2[k] <= N) if (comp[i][j] != comp[i + D1[k]][j + D2[k]] && (whcomp == -1 || size[comp[i + D1[k]][j + D2[k]]] > size[whcomp])) whcomp = comp[i + D1[k]][j + D2[k]]; if (whcomp == -1) break; result[++result[0]] = colcomp[whcomp]; 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 (comp[i][j] == 1) 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] && i != A[where - 1][1][1] - '0') { 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; 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(); } for (int i = 1; i <= aux[0]; ++i) cout << aux[i] << ' '; cout << '\n'; }