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.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int h = in.nextInt();
		int w = in.nextInt();
		int n = in.nextInt();
		char[][] field = new char[w][h];
		String line;
		for (int i = 0; i < h; i++) {
			line = in.next();
			for (int j = 0; j < w; j++) {
				field[j][h - i - 1] = line.charAt(j);
			}
		}
		for (int i = 0; i < h; i++) {
			for (int j = 0; j < w - 1; j++) {
				char[][] f = new char[w][h];
				for(int k=0;k<h;k++){
					for(int l=0;l<w;l++){
						f[l][k] = field[l][k];
					}
				}
				boolean[][] dis = new boolean[w][h];
				if (f[j][i] == '.' || f[j + 1][i] == '.')
					continue;
				char t = f[j][i];
				f[j][i] = f[j + 1][i];
				f[j + 1][i] = t;

				while (true) {
					// judge dis
					boolean disap = false;
					for (int k = 0; k < w; k++) {
						char now;
						for (int l = 0; l < h;l++) {
							int count = 1;
							now = f[k][l];
							if (now == '.')
								break;
							while (l + count < h && f[k][l + count] == now) {
								count++;
							}
							if (count >= n) {
								for (int m = 0; m < count; m++) {
									dis[k][l + m] = true;
								}
								disap = true;
							}
							l += count-1;
						}
					}

					for (int l = 0; l < h; l++) {
						char now;
						for (int k = 0; k < w; k++) {
							int count = 1;
							now = f[k][l];
							if(now=='.') continue;
							while (k + count < w && f[k + count][l] == now) {
								count++;
							}
							if (count >= n) {
								for (int m = 0; m < count; m++) {
									dis[k + m][l] = true;
								}
								disap = true;
							}
							k += count-1;
						}
					}

					if (!disap)
						break;

					char[][] next = new char[w][h];
					boolean clear = true;
					for (int k = 0; k < w; k++) {
						int bot = 0;
						int top = h - 1;
						for (int l = 0; l < h; l++) {
							if (f[k][l] != '.' && !dis[k][l]) {
								next[k][bot] = f[k][l];
								bot++;
							} else {
								next[k][top] = '.';
								top--;
							}
						}
						if (bot != 0)
							clear = false;
					}
					if(clear){
						System.out.println("YES");
						return;
					}
					f = next;
				}
			}
		}
		System.out.println("NO");
	}
}