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.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
	static char[][] map;
	static int h;
	static int w;
	static int n;
	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);
		h = stdIn.nextInt();
		w = stdIn.nextInt();
		n = stdIn.nextInt();
		map = new char[h][w];
		for(int i = 0; i < h; i++) {
			String tmp = stdIn.next();
			for(int j = 0; j < w; j++) {
				map[i][j] = tmp.charAt(j);
			}
		}
		System.out.println((solv())?"YES":"NO");
	}
	static char[][] Tmap;
	static boolean[][] isE;
	public static boolean solv() {
		Tmap = new char[h][w];
		for(int i = 0; i < h; i++) {
			for(int j = 1; j < w; j++) {
				isE = new boolean[h][w];
				for(int k = 0; k < map.length; k++) {
					Tmap[k] = Arrays.copyOf(map[k], map[k].length);
				}
				swap(i,j,i,j-1);
				if(start()) {
					return true;
				}
			}
		}
		return false;
	}
	
	public static void swap(int Fy, int Fx, int Ty, int Tx) {
		char tmp = Tmap[Fy][Fx];
		boolean t = isE[Fy][Fx];
		Tmap[Fy][Fx] = Tmap[Ty][Tx];
		isE[Fy][Fx] = isE[Ty][Tx];
		Tmap[Ty][Tx] = tmp;
		isE[Ty][Tx] = t;
	}
	
	public static boolean start() {
		while(true) {
			System.out.println();
			for(int i = 0; i < h; i++) {
				for(int j = 0; j < w; j++) {
					System.out.print(Tmap[i][j]);
				}
				System.out.println();
			}
			isE = new boolean[h][w];
			
			if(!fall() && !erase()) {
				return (isAllC())?true:false;
			}
			Erase();
		}
	}
	
	public static boolean fall() {
		boolean isC = false;
		for(int i = h-2; i >= 0; i--) {
			for(int j = 0; j < w; j++) {
				if(Tmap[i+1][j] == '.' && Tmap[i][j] != '.') {
					erase();
					swap(i,j,i+1,j);
					isC = true;
				}
			}
		}
		return isC;
	}
	
	public static boolean erase() {
		boolean isC = false;
		for(int i = h-1; i >= 0; i--) {
			for(int j = 0; j < w; j++) {
				if(Tmap[i][j] == '.') continue;
				char o = Tmap[i][j];
				boolean X = false;
				boolean Y = false;
				for(int k = j+1; k < w; k++) {
					if(Tmap[i][k] != o) break;
					if(k - j + 1 == n) {
						X = true;
						break;
					}
				}
				for(int k = i-1; k >= 0; k--) {
					if(Tmap[k][j] != o) break;
					if(k + i - 1 == n) {
						Y = true;
						break;
					}
				}
				if(X) {
					for(int k = j+1; k < w; k++) {
						if(Tmap[i][k] != o) break;
						isE[i][k] = true;;
					}
				}
				if(Y) {
					for(int k = i-1; k >= 0; k--) {
						if(Tmap[k][j] != o) break;
						isE[k][j] = true;
					}
				}
				if(X || Y) {
					isE[i][j] = true;
					isC = true;
				}
			}
		}
		return isC;
	}
	
	public static void Erase() {
		for(int i = 0; i < h; i++) {
			for(int j = 0; j < w; j++) {
				if(isE[i][j]) {
					Tmap[i][j] = '.';
				}
			}
		}
	}
	
	public static boolean isAllC() {
		for(int i = 0; i < h; i++) {
			for(int j = 0; j < w; j++) {
				if(Tmap[i][j] != '.') return false;
			}
		}
		return true;
	}
}