#include using namespace std; const int N = 105; #define mp make_pair int n; char c; char S[N][N]; bool odw[N][N]; vector > print_order[N * N]; struct ruch { pair from, to; }; vector slowa[N][N]; bool initial_check(vector > &pos) { if (n == 1) { printf("YES\n"); return true; } if (pos.size() == 1) { printf("YES\n"); return true; } if (c == 'R') { return false; } if (c == 'Q') { return false; } if (c == 'B') { int curr = (pos.front().first + pos.front().second) % 2; for (auto v : pos) { if ((v.first + v.second) % 2 != curr) { printf("NO\n"); return true; } } } if (c == 'N') { if (n == 2) { printf("NO\n"); return true; } if (n == 3 && S[1][1] == c) { printf("NO\n"); return true; } } if (c == 'K') { return false; } return false; } bool correct_field(pair pole) { return 0 <= pole.first && pole.first < n && 0 <= pole.second && pole.second < n && !odw[pole.first][pole.second]; } void handle_adding(pair pol1, pair pol2) { odw[pol2.first][pol2.second] = true; slowa[pol2.first][pol2.second] = slowa[pol1.first][pol1.second]; ruch new_ruch; new_ruch.from = pol2; new_ruch.to = pol1; slowa[pol2.first][pol2.second].push_back(new_ruch); if (S[pol2.first][pol2.second] == c) { print_order[slowa[pol2.first][pol2.second].size()].push_back(pol2); } } void bfs(pair start) { odw[start.first][start.second] = true; queue > order; order.push(start); while (!order.empty()) { pair x = order.front(); order.pop(); if (c == 'B') { for (int i = 1; i <= n; i++) { pair new_pole = mp(x.first + i, x.second + i); if (correct_field(new_pole)) { handle_adding(x, new_pole); order.push(new_pole); } new_pole = mp(x.first + i, x.second - i); if (correct_field(new_pole)) { handle_adding(x, new_pole); order.push(new_pole); } new_pole = mp(x.first - i, x.second + i); if (correct_field(new_pole)) { handle_adding(x, new_pole); order.push(new_pole); } new_pole = mp(x.first - i, x.second - i); if (correct_field(new_pole)) { handle_adding(x, new_pole); order.push(new_pole); } } } if (c == 'N') { for (auto v : {mp(1, 1), mp(1, -1), mp(-1, 1), mp(-1, -1)}) { for (auto w : {mp(1, 2), mp(2, 1)}) { pair new_pole = mp(x.first + w.first * v.first, x.second + w.second * v.second); if (correct_field(new_pole)) { handle_adding(x, new_pole); order.push(new_pole); } } } } } } void handle(vector > &pos) { if (c == 'N') { bfs(pos.front());; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (!odw[i][j] && S[i][j] == c) { printf("NO\n"); return; } } } printf("YES\n"); for (int i = 1; i <= n * n; i++) { for (auto v : print_order[i]) { reverse(slowa[v.first][v.second].begin(), slowa[v.first][v.second].end()); for (auto w : slowa[v.first][v.second]) { printf("%d %d %d %d\n", w.from.first + 1, w.from.second + 1, w.to.first + 1, w.to.second + 1); } } } return; } if (c == 'B') { int corner = (pos.front().first + pos.front().second) % 2; if (corner == 0) { bfs(mp(0, 0)); } else { bfs(mp(1, 0)); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (!odw[i][j] && S[i][j] == c) { printf("NO\n"); return; } } } printf("YES\n"); for (int i = 1; i <= n * n; i++) { for (auto v : print_order[i]) { reverse(slowa[v.first][v.second].begin(), slowa[v.first][v.second].end()); for (auto w : slowa[v.first][v.second]) { printf("%d %d %d %d\n", w.from.first + 1, w.from.second + 1, w.to.first + 1, w.to.second + 1); } } } return; } printf("YES\n"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (S[i][j] == 'R' || S[i][j] == 'Q') { // if (i == 0 && j == 2) { // cout << "siema " << endl; // } if (i > 0) { printf("%d %d 1 %d\n", i + 1, j + 1, j + 1); } if (j > 0) { printf("1 %d 1 1\n", j + 1); } } if (S[i][j] == 'K') { for (int k = i; k > 0; k--) { printf("%d %d %d %d\n", k + 1, j + 1, k, j + 1); } for (int k = j; k > 0; k--) { printf("1 %d 1 %d\n", k + 1, k); } } } } } int main() { scanf("%d %c", &n, &c); vector > pos; for (int i = 0; i < n; i++) { scanf("%s", &S[i]); } for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (S[i][j] == c) { pos.push_back(make_pair(i, j)); } } } if (initial_check(pos)) { return 0; } handle(pos); }