#include #define mp make_pair #define fi first #define se second #define pb push_back #define all(x) (x).begin(),(x).end() using namespace std; typedef long long LL; typedef unsigned long long uLL; typedef pair PII; typedef vector < int > VI; typedef double D; const int MN = 105, MX = 10005, inf = 1000000005, mod = 1000000007; const LL INF = 1000000000000000005LL; int n, czas; int kto[MN][MN]; char opis[MN][MN]; int DXB[] = {1, 1, -1, -1}; int DYB[] = {-1, 1, -1, 1}; int DXN[] = {-2, -2, 1, -1, 1, -1, 2, 2}; int DYN[] = {1, -1, 2, 2, -2, -2, 1, -1}; int DXK[] = {-1, -1, 0, 1, 1, 1, 0, -1}; int DYK[] = {0, 1, 1, 1, 0, -1, -1, -1}; VI G[MX], H[MX]; int used[MX], post[MN]; int numerek[MX]; int dep[MX], par[MX], in[MX]; VI raki[MX]; PII coords[MX]; bool inside(int a, int b) { return ((a > 0) && (b > 0) && (max(a, b) <= n)); } void rep(int i, int j) { for(int k = 1; k <= n; ++k) { if(kto[i][k]) G[kto[i][k]].pb(kto[i][j]); if(kto[k][j]) G[kto[k][j]].pb(kto[i][j]); } } void bu(int i, int j) { int a, b; for(int k = 0; k < 4; ++k) { a = i, b = j; while(inside(a, b)) { if(kto[a][b]) G[kto[a][b]].pb(kto[i][j]); a += DXB[k]; b += DYB[k]; } } } void qr(int i, int j) { rep(i, j); bu(i, j); } void nam(int i, int j) { for(int k = 0; k < 8; ++k) { int a = i + DXN[k]; int b = j + DYN[k]; if(inside(a, b) && kto[a][b]) G[kto[a][b]].pb(kto[i][j]); } } void kop(int i, int j) { for(int k = 0; k < 8; ++k) { int a = i + DXK[k]; int b = j + DYK[k]; if(inside(a, b) && kto[a][b]) G[kto[a][b]].pb(kto[i][j]); } } void dfsPost(int x) { post[++czas] = x; used[x] = 1; for(auto v : G[x]) if(!used[v]) dfsPost(v); } void dfsss(int x, int nr) { numerek[x] = nr; for(auto v : H[x]) if(!numerek[v]) dfsss(v, nr); } void dfsPath(int x, int d) { dep[x] = d; raki[d].pb(x); for(auto v : G[x]) if(!dep[v]) { par[v] = x; dfsPath(v, d + 1); } } int main() { char typ[3]; scanf("%d%s", &n, typ); for(int i = 1; i <= n; ++i) scanf("%s", opis[i] + 1); int N = 0; for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) { if(opis[i][j] != '.') { kto[i][j] = ++N; coords[N] = {i, j}; } } for(int i = 1; i <= n; ++i) for(int j = 1; j <= n; ++j) if(kto[i][j]) { if(opis[i][j] == 'R') { rep(i, j); } if(opis[i][j] == 'Q') { qr(i, j); } if(opis[i][j] == 'B') { bu(i, j); } if(opis[i][j] == 'N') { nam(i, j); } if(opis[i][j] == 'K') { kop(i, j); } } for(int i = 1; i <= N; ++i) for(auto v : G[i]) H[v].pb(i); for(int i = 1; i <= N; ++i) if(!used[i]) dfsPost(i); int num = 0; for(int i = N; i > 0; --i) if(!numerek[post[i]]) { ++num; dfsss(post[i], num); } for(int i = 1; i <= N; ++i) for(auto v : G[i]) if(numerek[v] != numerek[i]) ++in[numerek[v]]; int root = -1; for(int i = 1; i <= N; ++i) if(!in[numerek[i]]) { root = i; break; } dfsPath(root, 1); for(int i = 1; i <= N; ++i) if(i != root && !par[i]) { printf("NO"); return 0; } printf("YES\n"); for(int i = N; i > 1; --i) for(auto v : raki[i]) printf("%d %d %d %d\n", coords[v].fi, coords[v].se, coords[par[v]].fi, coords[par[v]].se); }