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 JAVA (judge verdict: Wrong Answer)

import java.util.*;

public class Main {
	static int h, w, n;
	static char[][] tfield;

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		h = sc.nextInt();
		w = sc.nextInt();
		n = sc.nextInt();
		char[][] field = new char[h][w];
		for (int i = 0; i < h; i++) {
			String s = sc.next();
			char[] ch = s.toCharArray();
			for (int j = 0; j < w; j++)
				field[i][j] = ch[j];
		}
		String result = "NO";
		out: for (int i = 0; i < h; i++)
			for (int j = 0; j < w - 1; j++) {
				tfield = new char[h][w];
				for (int k = 0; k < h; k++)
					for (int l = 0; l < w; l++)
						tfield[k][l] = field[k][l];
				if (tfield[i][j] != '.' && tfield[i][j + 1] != '.') {
					move(i, j);
					if (finished()) {
						result = "YES";
						break out;
					}
				}
			}
		System.out.println(result);
		sc.close();
	}

	static void move(int i, int j) {
		char tmp = tfield[i][j];
		tfield[i][j] = tfield[i][j + 1];
		tfield[i][j + 1] = tmp;
		while (erase())
			fall();
	}

	static boolean erase() {
		boolean result = false;
		boolean[][] bfield = new boolean[h][w];
		int[] dx = { -1, 0 }, dy = { 0, -1 };
		for (int i = 0; i < h; i++)
			for (int j = 0; j < w; j++) {
				bfield[i][j] = false;
				if (tfield[i][j] != '.') {
					for (int k = 0; k < 2; k++) {
						boolean b = false;
						if (i + dy[k] * (n - 1) >= 0
								&& j + dx[k] * (n - 1) >= 0) {
							b = true;
							for (int l = 0; l < n; l++) {
								b = b
										&& (tfield[i][j] == tfield[i + dy[k]
												* l][j + dx[k] * l]);

							}
						}
						int nx = j, ny = i;
						while (b && nx >= 0 && ny >= 0
								&& tfield[i][j] == tfield[ny][nx]) {
							bfield[ny][nx] = true;
							nx += dx[k];
							ny += dy[k];
						}
					}
				}
			}
		for (int i = 0; i < h; i++)
			for (int j = 0; j < w; j++)
				if (bfield[i][j]) {
					tfield[i][j] = '.';
					result = true;
				}
		return result;
	}

	static void fall() {
		for (int i = h - 1; i > 0; i--)
			for (int j = 0; j < w; j++)
				if (tfield[i][j] == '.') {
					int pointer = i;
					while (tfield[pointer][j] == '.' && pointer != 0)
						pointer--;
					tfield[i][j] = tfield[pointer][j];
					tfield[pointer][j] = '.';
				}
	}

	static boolean finished() {
		boolean result = true;
		for (int i = 0; i < h; i++)
			for (int j = 0; j < w; j++)
				result = result && tfield[i][j] == '.';
		return result;
	}

}