Problem:
Problem A: Ennichi

縁日に来たうさぎが, ある出店のゲームの景品がキャロットケーキであるのを見つけた. このゲームのルールは以下の通りである.

縦h マス× 横w マスの格子状のフィールドがあり, 各マスにつき高々1 個のブロックが置かれる. 各ブロックにはアルファベット大文字(‘A’ - ‘Z’) のいずれかで表される色がついている. 同色のブロックが縦または横に一直線上にn 個以上連続して並ぶと, それらのブロックは消滅する.

参加者は横に隣り合う2 つのマスを選んで, それらの状態を互いに入れ替える操作ができる. ブロックの入れ替え, 消滅, 落下によってブロックの有るマスの1 つ下のマスにブロックが無くなると, このブロックは落下する. このときふたたび同色のブロックがn 個以上並ぶと消滅する. ただし, ブロックの消滅は, 落下するブロックが存在する間は起こらず, すべてのブロックの落下が終了したタイミングで同時に起こる.

1 回の操作でフィールド上のすべてのブロックを消滅させると, このゲームは成功となり景品のケーキを得ることができる. うさぎは1 回分の参加費で確実にケーキを手に入れたく, それができない場合は参加したくない. ゲーム開始時のフィールドの状態から, うさぎがこのゲームに参加すべきであるか答えよ.

Input

入力の一行目にはh, w, n がスペースで区切られて与えられる.

2 ≤ h,w, n ≤ 30

続くh 行にはフィールドの状態が上から順に与えられる. アルファベット大文字はブロックを, ‘.’ は空きマスを表す. 与えられるフィールドの状態には, 縦あるいは横にn 個以上連続する同色のブロックはなく, 落下する状態にあるブロックもない. 1 個以上のブロックが存在する.

Output

うさぎがこのゲームに参加すべきであるなら”YES”を, そうでないなら”NO”を一行に出力せよ.

Sample Input 1

4 6 3
......
...Y..
...Y..
RRYRYY

Sample Output 2

YES

Sample Input 1

4 6 3
......
...Y..
...Y..
RRYRY.

Sample Output 2

NO

Solution in C++ (judge verdict: Accepted)

#include <iostream>
#include <iomanip>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
#include <utility>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <functional>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cassert>
 
using namespace std;
 
#define REP(i,s,e) for(int i=(s); i<(int)(e); i++)
#define rep(i,n) REP(i, 0, n)
#define pb push_back
#define mp make_pair
#define all(r) (r).begin(),(r).end()
#define rall(r) (r).rbegin(),(r).rend()
#define fi first
#define se second
#define DBG(X) cout<<" "<<#X<<" : "<<X<<endl
 
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef pair<int, int> pii;

const int INF = 1e9;
const double EPS = 1e-8;
const int mod = 1e9 + 7;
const ll LINF = 1e18;

struct Input
{
	int n;char c;char str[10010];string s;ll l;double d;
	int nextInt(){scanf("%d", &n);return n;}
	ll nextLong(){scanf("%lld", &l);return l;}
	double nextDouble(){scanf("%lf", &d);return d;}
	char nextChar(){scanf("%c", &c);return c;}
	string next(){scanf("%s", str);return string(str);}
	string nextLine(){getline(cin, s);return s;}
};
Input in;

int h, w, n;
vector<string> s, t;
bool clear[40][40];
bool check(){
	// rep(i, h) cout<<t[i]<<endl;
	// cout<<endl;
	bool isclear = true;
	for(int  i = 0; i < h; i++) for(int j = 0; j < w; j++){
		if(t[i][j] != '.') {
			isclear = false;
			break;
		}
	}
	if(isclear) return true;
	for(int i = 1; i < h; i++){
		for(int j = 0; j < w; j++){
			if(t[i][j] == '.' && t[i-1][j] != '.'){
				for(int k = i; k > 0; k--) t[k][j] = t[k-1][j];
				t[0][j] = '.';
			}
		}
	}
	bool update = false;
	rep(i, h) rep(j, w) clear[i][j] = false;
	rep(i, h - n + 1) rep(j, w){
		if(t[i][j] == '.') continue;
		bool f = false;
		rep(k, n-1) if(t[i+k][j] != t[i+k+1][j]){
			f = true;
			break;
		}
		if(f) continue;
		rep(k, n) clear[i+k][j] = true;
		update = true;
	}
	rep(i, h) rep(j, w - n + 1){
		if(t[i][j] == '.') continue;
		bool f = false;
		rep(k, n-1) if(t[i][j+k] != t[i][j + k + 1]){
			f = true;
			break;
		}
		if(f) continue;
		rep(k, n) clear[i][j + k] = true;
		update = true;
	}
	for(int j = 0; j < w; j++){
		for(int i = 0; i < h; i++){
			if(!clear[i][j]) continue;
			for(int k = i; k > 0;k--) t[k][j] = t[k-1][j];
			t[0][j] = '.';
		}
	}
	if(!update) return false;
	return check();
}

int main(){
	h = in.nextInt();
	w = in.nextInt();
	n = in.nextInt();
	s.resize(h);
	rep(i, h) s[i] = in.next();
	// for(int x1 = 0; x1 < w; x1++){
	// 		for(int y1 = 0; y1 < h-1; y1++){
	// 				t = s;
	// 				swap(t[y1][x1], t[y1+1][x1]);
	// 				//cout<<"----------"<<endl;
	// 				if(check()) {
	// 					cout<<"YES"<<endl;
	// 					return 0;
	// 				}
	// 		}
	// }
	for(int x1 = 0; x1 < w-1; x1++){
			for(int y1 = 0; y1 < h; y1++){
					t = s;
					swap(t[y1][x1], t[y1][x1+1]);
					//cout<<"----------"<<endl;
					if(check()) {
						cout<<"YES"<<endl;
						return 0;
					}
			}
	}
	cout<<"NO"<<endl;
}