#define NDEBUG 1

#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <cassert>
#include <string>
#include <stack>
#include <queue>
using namespace std;

#define loop(i,a,b) for(int i=(a);i<int(b);i++)
#define rep(i,b) loop(i,0,b)

typedef long long ll;

int h,w,n;

int erase(vector<string> & g){
    bool rem[30][30];
    rep(i,h)rep(j,w) rem[i][j] = g[i][j] != '.';
    rep(i,h)rep(j,w){
        int ni = i;
        while(ni < h && g[i][j] == g[ni][j]) ni++;
        if(ni-i >= n) loop(ii,i,ni) rem[ii][j] = false;
        int nj = j;
        while(nj < w && g[i][j] == g[i][nj]) nj++;
        if(nj-j >= n) loop(jj,j,nj) rem[i][jj] = false;
    }

    int res = 0;
    rep(i,h)rep(j,w){
        if(!rem[i][j] && g[i][j]!='.'){
            g[i][j] = '.';
            res++;
        }
    }
    return res;
}

void fall(vector<string> & g){
    // vector<stack<char>> pillar;
    rep(j,w){
        int top = h-1;
        for(int i=h-1;i>=0;i--){
            if(g[i][j] != '.'){
                g[top--][j] = g[i][j];
            }
        }
        while(top >= 0) g[top--][j] = '.';
    }
}

bool solve(vector<string> const & g){
    int rem = 0;
    rep(i,h)rep(j,w) if(g[i][j] != '.') rem++;
    rep(i,h)rep(j,w-1){
        int rrem = rem;
        auto ng = g;
        swap(ng[i][j],ng[i][j+1]);
        fall(ng);
        while(1){
            int e = erase(ng);
            if(e) fall(ng), rrem -= e;
            else break;
        }
        if(rrem == 0) return true;
    }
    return false;
}

int main(){
    while(cin >> h >> w >> n){
        vector<string> g(h);
        rep(i,h) cin >> g[i];
        puts(solve(g) ? "YES" : "NO");
    }
}