#ifndef LOCAL #pragma GCC optimize("O3") #endif #include using namespace std; #define sim template muu & operator<<( #define ris return *this #define R22(r) sim>typename enable_if<1 r sizeof(dud(0)),muu&>::type operator<<(c g) { #define R23(r) sim, size_t N>typename enable_if::value,muu&>::type operator<<(zub sim> struct rge {c b, e;}; sim> rge range(c i, c j) {return rge{i, j};} sim> auto dud(c*r)->decltype(cerr << *r); sim> char dud(...); sim, size_t N> struct zub {c x;}; struct muu { #ifdef LOCAL #define qel(t) sim, class d, class...e mor t r){ris << *(d*)&r;} qel(queue) qel(priority_queue) qel(stack) stringstream a; ~muu() {cerr << a.str() << endl;} R22(<) a << boolalpha << g; ris;} R22(==) ris << range(begin(g), end(g));} sim mor rge u) { a << "["; for (c i = u.b; i != u.e; ++i) *this << ", " + 2 * (i == u.b) << *i; ris << "]"; } sim, class m mor pair r){ris << "(" << r.first << ", " << r.second << ")";} sim, class...m mor tupler){ris << zub,0>{r};} R23(!=) g) {ris << (N ? ", " : "(") << get(g.x) << zub{g.x};} R23(==) ) {ris << ")";} #else sim mor const c&){ris;} #endif }; #define imie(r...) "[" #r ": " << (r) << "] " #define arr(a, i) "[" #a imie(i) ": " << a[i] << "] " #define range(a, b) "[[" #a ", " #b "): " << range(a, b) << "] " #define debug muu() << __FUNCTION__ << "#" << __LINE__ << ": " #define arr2(a, i, j) "[" #a imie(i) imie(j) ": " << a[i][j] << "] " #define imask(r...) "[" #r ": " << bitset<8 * sizeof(r)>(r) << "] " using pii = pair ; using ll = long long; using ull = unsigned long long; using ld = long double; using Pii = pii; using vpii = vector; using unt = unsigned int; using vi = vector ; using pll = pair ; using vpll = vector ; sim> void mini(c &a, c b) {if (a > b) a = b;} sim> void maxi(c &a, c b) {if (a < b) a = b;} #include #include using namespace __gnu_pbds; sim, class cmp = less > using ordered_set = tree; const int maxn = 110; char M[maxn][maxn]; int n; char ex; vector wierz; vector E[maxn * maxn]; bool ok(pii p) { if(p.first < 0 || p.second < 0) return false; if(p.first >= n || p.second >= n) return false; if(M[p.first][p.second] == '.') return false; return true; } vector ans; bool vis[maxn * maxn]; void dfs(int x, int ojciec) { debug << imie(x) << imie(ojciec) << imie(vis[x]); if(vis[x] == true) return; vis[x] = true; for(int y : E[x]) dfs(y, x); if(ojciec != -1) { ans.push_back({x, ojciec}); } } int main() { { scanf("%d", &n); char buff[10]; scanf("%s", buff); ex = buff[0]; } for(int i = 0; i < n; ++i) scanf("%s", M[i]); for(int i = 0; i < n; ++i) for(int j = 0; j < n; ++j) if(M[i][j] != '.') wierz.push_back(i * n + j); for(auto w : wierz) { int x = w / n; int y = w % n; vector somsiednie; auto wrzuc = [&](int xi, int yi) { if(ok({xi, yi})) somsiednie.push_back(xi * n + yi); }; if(ex == 'R') { for(int i = 1; i <= n; ++i) { wrzuc(x - i, y); wrzuc(x + i, y); wrzuc(x, y + i); wrzuc(x, y - i); } } if(ex == 'Q') { for(int i = 1; i <= n; ++i) { wrzuc(x - i, y); wrzuc(x + i, y); wrzuc(x, y + i); wrzuc(x, y - i); wrzuc(x - i, y - i); wrzuc(x + i, y + i); wrzuc(x - i, y + i); wrzuc(x + i, y - i); } } if(ex == 'B') { for(int i = 1; i <= n; ++i) { wrzuc(x - i, y - i); wrzuc(x + i, y + i); wrzuc(x - i, y + i); wrzuc(x + i, y - i); } } if(ex == 'N') { wrzuc(x - 1, y - 2); wrzuc(x - 1, y + 2); wrzuc(x + 1, y - 2); wrzuc(x + 1, y + 2); wrzuc(x - 2, y - 1); wrzuc(x - 2, y + 1); wrzuc(x + 2, y - 1); wrzuc(x + 2, y + 1); } if(ex == 'K') { for(int i = 1; i <= 1; ++i) { wrzuc(x - i, y); wrzuc(x + i, y); wrzuc(x, y + i); wrzuc(x, y - i); wrzuc(x - i, y - i); wrzuc(x + i, y + i); wrzuc(x - i, y + i); wrzuc(x + i, y - i); } } E[w] = somsiednie; } debug << imie(wierz); for(auto w : wierz) debug << imie(E[w]); dfs(wierz[0], -1); debug << imie(ans); if(ans.size() + 1 != wierz.size()) { puts("NO"); } else { puts("YES"); for(auto p : ans) { int x1 = p.first / n; int y1 = p.first % n; int x2 = p.second / n; int y2 = p.second % n; printf("%d %d %d %d\n", x1 + 1, y1 + 1, x2 + 1, y2 + 1); } } }