#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]; vector> g; map mapg; map revmap; char piece, b[114][114]; 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 go (int x, int p, bool print) { if (u[x]) return; u[x] = 1; ++vis; for (auto y : g[x]) go(y, x, print); if (print && p != -1) { pii from = revmap[x]; pii to = revmap[p]; printf("%d %d %d %d\n", from.first + 1, from.second + 1, to.first + 1, to.second + 1); } } 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; } } vis = 0; MM(u, 0); FOR(i, 0, n) FOR(j, 0, n) if (!vis && b[i][j] == piece) go(getv(i, j), -1, false); if (vis != (int)g.size()) { printf("NO\n"); return; } printf("YES\n"); MM(u, 0); FOR(i, 0, n) FOR(j, 0, n) if (b[i][j] == piece) { go(getv(i, j), -1, true); return; } } int main () { init_io(); int T = 1; //R(T); while (T--) solve(); return 0; }