#include <iostream> #include <algorithm> #include <cstring> #include <stack> using namespace std; const int T[5][7] = {0}; int n; struct Move { int x, y, g; Move() {} Move(int a, int b, int c) {x = a; y = b; g = c;} friend ostream& operator << (ostream& cout, Move a) { cout << a.x << ' ' << a.y << ' ' << a.g; return cout; } } C; stack<Move> s; void Switch(int a[5][7], int c[17]) { int i, j, k, x, y, sx, tx, sy, ty; bool OK, vx[5][7], vy[5][7], Cl[5][7]; for (i = 0; i < 5; i++) for (j = 0; j < 7; j++) if (!a[i][j]) { for (k = j + 1; k < 7; k++) if (a[i][k]) {swap(a[i][j], a[i][k]); break;} if (k == 7) break; } do { OK = true; memset(vx, 0, sizeof(vx)); memset(vy, 0, sizeof(vy)); memset(Cl, 0, sizeof(Cl)); for (x = 0; x < 5; x++) for (y = 0; y < 7; y++) { if (!vx[x][y]) { sx = 0; tx = 4; if (x > 0) for (sx = x - 1; true; sx--) { if (a[sx][y] != a[sx + 1][y]) {sx++; break;} if (sx == 0) break; } if (x < 4) for (tx = x + 1; true; tx++) { if (a[tx][y] != a[tx - 1][y]) {tx--; break;} if (tx == 4) break; } for (i = sx; i <= tx; i++) vx[i][y] = true; if (tx - sx >= 2) for (i = sx; i <= tx; i++) Cl[i][y] = true; } if (!vy[x][y]) { sy = 0; ty = 6; if (y > 0) for (sy = y - 1; true; sy--) { if (a[x][sy] != a[x][sy + 1]) {sy++; break;} if (sy == 0) break; } if (y < 6) for (ty = y + 1; true; ty++) { if (a[x][ty] != a[x][ty - 1]) {ty--; break;} if (ty == 6) break; } for (i = sy; i <= ty; i++) vy[x][i] = true; if (ty - sy >= 2) for (i = sy; i <= ty; i++) Cl[x][i] = true; } } for (i = 0; i < 5; i++) for (j = 0; j < 7; j++) if (Cl[i][j]) {c[a[i][j]]--; a[i][j] = 0;} for (i = 0; i < 5; i++) for (j = 0, k = 1; k < 7; j++, k++) if (!a[i][j]) { while (!a[i][k] && k < 7) k++; if (k == 7) break; swap(a[i][j], a[i][k]); OK = false; } } while (!OK); } bool DFS(int Cur, const int a[5][7], const int Color[17]) { if (Cur == n) return !memcmp(a, T, sizeof(T)); int x, y, g, f[5][7] = {0}, c[17]; for (x = 1; x <= 10; x++) if (Color[x] == 1 || Color[x] == 2) return false; memcpy(f, a, sizeof(f)); copy(Color, Color + 17, c); for (x = 0; x < 4; x++) for (y = 0; y < 7; y++) if (f[x][y]) { if (f[x][y] == f[x + 1][y]) continue; g = 1; swap(f[x][y], f[x + 1][y]); Switch(f, c); if (DFS(Cur + 1, f, c)) {s.push(Move(x, y, g)); return true;} memcpy(f, a, sizeof(f)); copy(Color, Color + 17, c); if (x > 0 && !f[x - 1][y]) { g = -1; swap(f[x][y], f[x - 1][y]); Switch(f, c); if (DFS(Cur + 1, f, c)) {s.push(Move(x, y, g)); return true;} memcpy(f, a, sizeof(f)); copy(Color, Color + 17, c); } } else break; for (y = 0; y < 7; y++) if (f[x][y]) { if (f[x][y] == f[x - 1][y]) continue; g = -1; swap(f[x][y], f[x - 1][y]); Switch(f, c); if (DFS(Cur + 1, f, c)) {s.push(Move(x, y, g)); return true;} memcpy(f, a, sizeof(f)); copy(Color, Color + 17, c); } else break; return false; } int main() { int i, j, t, a[5][7] = {0}, c[17] = {0}; cin >> n; for (i = 0; i < 5; i++) { j = 0; while ((cin >> t) && t) { a[i][j] = t; c[a[i][j++]]++; } } if (DFS(0, a, c)) while (!s.empty()) { C = s.top(); s.pop(); cout << C << endl; } else cout << -1 << endl; return 0; } /************************************************************** Problem: 2306 User: admin Language: C++ Result: Accepted Time:1523 ms Memory:2080 kb ****************************************************************/