#include struct res { int x1; int y1; int x2; int y2; }; static char M[128][128]; static struct res R[10001]; static int recurse(int x, int y, int xp, int yp, int k, int n) { if (x < 0 || y < 0 || x >= k || y >= k) return n; char t = M[x][y]; if (t == '.') return n; M[x][y] = '.'; if (t == 'R' || t == 'Q') { for (int i = 0; i < k; i++) { n = recurse(i, y, x, y, k, n); n = recurse(x, i, x, y, k, n); } } if (t == 'B' || t == 'Q') { for (int i = 1 - k; i < k; i++) { n = recurse(x + i, y + i, x, y, k, n); n = recurse(x - i, y + i, x, y, k, n); } } if (t == 'N') { n = recurse(x - 1, y - 2, x, y, k, n); n = recurse(x + 1, y - 2, x, y, k, n); n = recurse(x - 2, y - 1, x, y, k, n); n = recurse(x + 2, y - 1, x, y, k, n); n = recurse(x - 2, y + 1, x, y, k, n); n = recurse(x + 2, y + 1, x, y, k, n); n = recurse(x - 1, y + 2, x, y, k, n); n = recurse(x + 1, y + 2, x, y, k, n); } if (t == 'K') { n = recurse(x - 1, y - 1, x, y, k, n); n = recurse(x, y - 1, x, y, k, n); n = recurse(x + 1, y - 1, x, y, k, n); n = recurse(x - 1, y, x, y, k, n); n = recurse(x + 1, y, x, y, k, n); n = recurse(x - 1, y + 1, x, y, k, n); n = recurse(x, y + 1, x, y, k, n); n = recurse(x + 1, y + 1, x, y, k, n); } R[n].x1 = x + 1; R[n].y1 = y + 1; R[n].x2 = xp + 1; R[n].y2 = yp + 1; return n + 1; } int main() { int k = 0, x = 0, y = 0, n = 0; scanf("%d %*c", &k); for (int i = 0; i < k; i++) scanf("%s", M[i]); for (int i = 0; i < k; i++) { for (int j = 0; j < k; j++) { if (M[i][j] != '.') { if (!n) { x = i; y = j; } n++; } } } int m = recurse(x, y, x, y, k, 0); if (m != n) printf("NO\n"); else { printf("YES\n"); for (int i = 0; i < n - 1; i++) { printf("%d %d %d %d\n", R[i].x1, R[i].y1, R[i].x2, R[i].y2); } } return 0; }