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 C (judge verdict: Accepted)

#include <stdio.h>
#include <string.h>

char a[32][32], b[32][32], t[32][32];
int h, w, n;

int func(void)
{
    int i, j, k, l, res;
    memcpy(b, a, sizeof(a));
    for(j=0;j<w;++j) {
        k=h;
        for(i=h-1;i>=0;--i) if (b[i][j]!='.') a[--k][j]=b[i][j];
        for(i=k-1;i>=0;--i) a[i][j]='.';
    }
    memcpy(b, a, sizeof(a));

    for(i=0;i<h;++i) for(j=0;j<w;++j) if (a[i][j]!='.') {
        for(k=0;j+k<w && a[i][j]==a[i][j+k];++k);
        if (k>=n)
            for(l=0;l<k;++l) b[i][j+l]='.';
        j+=k-1;
    }
    for(j=0;j<w;++j) for(i=0;i<h;++i) if (a[i][j]!='.') {
        for(k=0;i+k<h && a[i][j]==a[i+k][j];++k);
        if (k>=n)
            for(l=0;l<k;++l) b[i+l][j]='.';
        i+=k-1;
    }

    res=w*h;
    for(j=0;j<w;++j) {
        k=h;
        for(i=h-1;i>=0;--i) if (b[i][j]!='.') a[--k][j]=b[i][j];
        for(i=k-1;i>=0;--i) a[i][j]='.';
        res-=k;
    }
    return res;
}

void swap(char* a, char* b) { char x=*a; *a=*b; *b=x; }

int main(void)
{
    while (~scanf("%d%d%d", &h, &w, &n)) {
        int i, j, yes;
        for(i=0;i<h;++i) scanf("%s", a[i]);

        yes=0;
        memcpy(t, a, sizeof(a));
        for(i=0;i<h;++i) for(j=0;j<w-1;++j) if (a[i][j]!='.' || a[i][j+1]!='.') {
            int p=-1, q=-1;
            swap(&a[i][j], &a[i][j+1]);
            do {
                q=p;
                p=func();
            } while (p!=q);
            if (p==0) { yes=1; goto END; }
            memcpy(a, t, sizeof(a));
        }
END:
        puts(yes ? "YES" : "NO");
    }
    return 0;
}