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.Arrays;
import java.util.Scanner;

public class Main {
	int h, w, n;
	char[][] map, tempMap;
	boolean[][] deleteMap;
	
	void dropBlock() {
		for (int ii = 0; ii <= h; ii++) {
			for (int i = h; i >= 2; i--) {
				for (int j = 1; j <= w; j++) {
					if (tempMap[i][j] == '.' && tempMap[i-1][j] != '.') {
						tempMap[i][j] = tempMap[i-1][j];
						tempMap[i-1][j] = '.';
					}
				}
			}
		}
	}
	
	void addDeleteTarget(int y, int x, int dir) {
		if (dir == 0) {
			for (int i = 0; i < n; i++) {
				deleteMap[y][x+i] = true;
			}
		} else {
			for (int i = 0; i < n; i++) {
				deleteMap[y+i][x] = true;
			}
		}
	}
	
	boolean blockDeleted() {
		boolean blockLeft = false;
		boolean deletable = false;	
		
		dropBlock();
		/*
		for (int i = 1; i <= h; i++) {
			for (int j = 1; j <= w; j++) {
				System.out.print(tempMap[i][j]);
			}
			System.out.println();
		}
		System.out.println();
		*/
		
		for (int i = 1; i <= h; i++) {
			Arrays.fill(deleteMap[i], false);
		}
		
		for (int i = 1; i <= h; i++) {
			for (int j = 1; j <= w; j++) {
				char next = tempMap[i][j];
				if (next == '.') continue;
				else blockLeft = true;
				
				for (int k = 1; k < n; k++) {
					if (tempMap[i][j+k] != next) break;
					else if (k == n - 1) { 
						deletable = true;
						addDeleteTarget(i, j, 0);
					}
				}
				
				for (int k = 1; k < n; k++) {
					if (tempMap[i+k][j] != next) break;
					else if (k == n - 1) { 
						deletable = true;
						addDeleteTarget(i, j, 1);
					}
				}
			}
		}
		for (int i = 1; i <= h; i++) {
			for (int j = 1; j <= w; j++) {
				if (deleteMap[i][j]) tempMap[i][j] = '.';
			}
		}
		
		if (blockLeft) {
			if (deletable) {
				return blockDeleted();
			} else {
				return false;
			}
		} else {
			return true;
		}
	}
	
	void swap(int y, int x, int yy, int xx) {
		char temp = map[y][x];
		map[y][x] = map[y+yy][x+xx];
		map[y+yy][x+xx] = temp;
	}
	
	void copyMap() {
		for (int i = 1; i <= h; i++) {
			for (int j = 1; j <= w; j++) {
				tempMap[i][j] = map[i][j];
			}
		}
	}
	public void run() {
		boolean flag = false;
		Scanner in = new Scanner(System.in);
		h = in.nextInt();
		w = in.nextInt();
		n = in.nextInt();
		map = new char[h+2][w+2];
		tempMap = new char[h+2][w+2];
		deleteMap = new boolean[h+2][w+2];
		
		for (int i = 0; i <= h + 1; i++) {
			String s = "";
			if (i != 0 && i != h + 1)
				s = in.next();
			for (int j = 0; j <= w + 1; j++) {
				if (i == 0 || i == h + 1 || j == 0 || j == w + 1) 
					map[i][j] = 0;
				else
					map[i][j] = s.charAt(j - 1);
			}
		}
		end:
			for (int i = 1; i <= h; i++) {
				for (int j = 1; j <= w; j++) {
					if (map[i][j] != 0 && map[i][j+1] != 0) {
						swap(i, j, 0, 1);
						copyMap();
						if (blockDeleted()) {
							flag = true;
						}
						swap(i, j, 0, 1);
					}
					if (map[i][j] != 0 && map[i+1][j] != 0) {
						swap(i, j, 1, 0);
						copyMap();
						if (blockDeleted()) {
							flag = true;
						}
						swap(i, j, 1, 0);
					}
					if (flag) break end;
				}
			}
		
		if (flag) System.out.println("YES");
		else System.out.println("NO");
	}
	
	public static void main(String[] args) {
		new Main().run();
	}

}