#include using namespace std; typedef long long int ll; typedef pair pii; bool R(){return true;} template bool R(T & x, Args & ... args){return cin >> x && R(args...);} void init_io(){ios::sync_with_stdio(false);cin.tie(0);} #define PB push_back #define FOR(prom, a, b) for(int prom = (a); prom < (b); prom++) #define FORDE(prom, a, b) for(int prom = (a); prom >= (b); prom--) #define ALL(vec) (vec).begin(), (vec).end() #define MM(co, cim) memset((co), (cim), sizeof((co))) #define DEB(x) cerr << ">>> " << #x << " : " << x << endl; #define INF 1000000007 #define INFLL 4000000000000000007LL int n, vis, u[10014], par[10014], deg[10014]; vector> g; map mapg; map revmap; char piece, b[114][114]; queue q; int getv (int x, int y) { if (!mapg.count({x, y})) { mapg[{x, y}] = g.size(); revmap[g.size()] = {x, y}; g.PB(vector()); } return mapg[{x, y}]; } bool try_add_edge (int from_x, int from_y, int to_x, int to_y) { if (to_x < 0 || to_x >= n || to_y < 0 || to_y >= n) return true; if (b[to_x][to_y] == piece) { int from = getv(from_x, from_y); int to = getv(to_x, to_y); g[from].PB(to); return true; } return false; } void solve () { R(n, piece); FOR(i, 0, n) FOR(j, 0, n) R(b[i][j]); FOR(i, 0, n) FOR(j, 0, n) if (b[i][j] == piece) { getv(i, j); switch (piece) { case 'K': FOR(di, -1, 2) FOR(dj, -1, 2) if (di * di + dj * dj >= 1) try_add_edge(i, j, i + di, j + dj); break; case 'Q': FOR(di, -1, 2) FOR(dj, -1, 2) if (di * di + dj * dj == 1 || (di && abs(di) == abs(dj))) { FOR(dist, 1, n) if (try_add_edge(i, j, i + dist * di, j + dist * dj)) break; } break; case 'R': FOR(di, -1, 2) FOR(dj, -1, 2) if (di * di + dj * dj == 1) { FOR(dist, 1, n) if (try_add_edge(i, j, i + dist * di, j + dist * dj)) break; } break; case 'B': FOR(di, -1, 2) FOR(dj, -1, 2) if (di && abs(di) == abs(dj)) { FOR(dist, 1, n) if (try_add_edge(i, j, i + dist * di, j + dist * dj)) break; } break; case 'N': vector moves = {{-2, 1}, {-1, 2}, {1, 2}, {2, 1}, {2, -1}, {1, -2}, {-1, -2}, {-2, -1}}; for (auto en : moves) { try_add_edge(i, j, i + en.first, j + en.second); } break; } } MM(par, -1); MM(deg, 0); vis = 0; MM(u, 0); q.push(0); while (!q.empty()) { int x = q.front();q.pop(); if (u[x]) continue; u[x] = 1; ++vis; for (auto y : g[x]) if (!u[y]) { q.push(y); if (par[y] == -1) { par[y] = x; ++deg[x]; ++deg[y]; } } } if (vis != (int)g.size()) { printf("NO\n"); return; } printf("YES\n"); FOR(i, 0, (int)g.size()) if (deg[i] == 1) q.push(i); while (!q.empty()) { int x = q.front();q.pop(); int p = par[x]; if (p != -1) { pii xcoord = revmap[x]; pii pcoord = revmap[p]; printf("%d %d %d %d\n", xcoord.first + 1, xcoord.second + 1, pcoord.first + 1, pcoord.second + 1); --deg[x]; if (--deg[p] == 1) q.push(p); } } } int main () { init_io(); int T = 1; //R(T); while (T--) solve(); return 0; }