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

require 'set'
h, w, N = gets.split.map(&:to_i)

cols = (1..h).map { gets.chomp.split("") }.transpose.map(&:reverse)
GOAL = [ [?.] * h ] * w

def check_swap(cols, c1, r1, c2, r2)
    return nil if cols[c1][r1] == cols[c2][r2]

    copy = cols.map(&:dup)
    copy[c1][r1], copy[c2][r2] = copy[c2][r2], copy[c1][r1]

    drop(copy)
    drop(copy) while changed = erase(copy) 

    return copy == GOAL
end

def erase(cols)
    to_be_erased = Set.new
    (0..cols.size-1).each do |i|
        x = nil
        n = 0
        cols[i].each.with_index do |y, j|
            if y == ?.
                n = 0
            elsif y == x
                n += 1
            else
                x = y
                n = 1
            end
            if n == N
                (0..n-1).each do |k|
                    to_be_erased << [i, j-k]
                end
            elsif n > N
                to_be_erased << [i, j]
            end
            x = y
        end
    end

    (0..cols[0].size-1).each do |j|
        x = nil
        n = 0
        (0..cols.size-1).each do |i|
            y = cols[i][j]
            if y == ?.
                n = 0
            elsif y == x
                n += 1
            else
                x = y
                n = 1
            end
            if n == N
                (0..n-1).each do |k|
                    to_be_erased << [i-k, j]
                end
            elsif n > N
                to_be_erased << [i, j]
            end
            x = y
        end
    end

    to_be_erased.each do |i, j|
        cols[i][j] = ?.
    end

    return ! to_be_erased.empty?
end

def drop(cols)
    cols.map! do |col|
        n = col.size
        col.delete(?.)
        col += [?.] * (n - col.size)
    end
end

(0..w-2).each do |c|
    (0..h-1).each do |r|
        if check_swap(cols, c, r, c+1, r)
            puts 'YES'
            exit
        end
    end
end

puts 'NO'