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{
	
	private void doit(){
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext()){
			int h = sc.nextInt();
			int w = sc.nextInt();
			int n = sc.nextInt();
			char [][] data = new char[h][w];
			for(int i = 0; i < h; i++){
				data[i] = sc.next().toCharArray();
			}
			boolean flg = false;
			for(int i = 0; i < h; i++){
				for(int j = 0; j < w-1; j++){
					if(data[i][j] == data[i][j + 1])continue;
					
					char c = data[i][j];
					data[i][j] = data[i][j +1];
					data[i][j + 1] = c;
					
					boolean res = check(data,w,h,n);
					if(res){
						flg = true;
					}
					
					c = data[i][j];
					data[i][j] = data[i][j +1];
					data[i][j + 1] = c;
				}
			}
			System.out.println(flg ? "YES" : "NO");
		}
	}
	
	private boolean check(char[][] data, int w, int h, int n) {
		char [][] work = new char[h][w];
		for(int i = 0; i < h; i++){
			for(int j = 0; j < w; j++){
				work[i][j] = data[i][j];
			}
		}
		boolean update = true;
		while(update){
			update = false;
			boolean [][] iserase = new boolean[h][w];
			for(int i = 0; i < h; i++){
				for(int j = 0; j < w; j++){
					if(iserase[i][j]) continue;
					if(work[i][j] == '.') continue;
					int count = 0;
					for(int k = j; k < w; k++){
						if(work[i][j] == work[i][k]){
							count++;
						}
					}
					if(count >= n){
						for(int k = j; k < w; k++){
							if(work[i][j] == work[i][k]){
								iserase[i][k] = true;
							}
						}
					}
					
					count = 0;
					for(int k = i; k < h; k++){
						if(work[i][j] == work[k][j]){
							count++;
						}
					}
					if(count >= n){
						for(int k = i; k < h; k++){
							if(work[i][j] == work[k][j]){
								iserase[k][j] = true;
							}
						}
					}
				}
			}
			
			for(int i = 0; i < h; i++){
				for(int j = 0; j < w; j++){
					if(iserase[i][j]) work[i][j] = '.';
				}
			}
			
			for(int i = 0; i < w; i++){
				int ind = h-1;
				for(int j = h-1; j >= 0; j--){
					if(work[j][i] != '.'){
						work[ind][i] = work[j][i];
						ind--;
					}
				}
				for(; ind >= 0; ind--){
					work[ind][i] = '.';
				}
			}
		}
		for(int i = 0; i < h; i++){
			for(int j = 0; j < w; j++){
				if(work[i][j] != '.') return false;
			}
		}
		
		return true;
	}

	private void debug(Object... o) {
		System.out.println("debug = " + Arrays.deepToString(o));
	}

	public static void main(String[] args) {
		new Main().doit();
	}
}