#include<bits/stdc++.h>
using namespace std;

#define MAX 35

int h, w, n;
/*
bool annihilation(vector<string> &field, int y, int x){
  if(field[y][x] == '.') return false;
  
  for(int ii = -1; ii <= 1; ii++){
    for(int jj = -1; jj <= 1; jj++){
      if(!ii && !jj) continue;
      if(ii && jj) continue;
      int con = 0;

      int i = ii, j = jj;
      for(int nx = x, ny = y; 0 <= nx && nx < w && 0 <= ny && ny < h; nx += j, ny += i, con++){
	if(field[ny][nx] != field[y][x]) break;
	if(con + 1>= n) return true;
      }
      
      i *= -1, j *= -1;
      
      for(int nx = x+j, ny = y+i; 0 <= nx && nx < w && 0 <= ny && ny < h; nx += j, ny += i, con++){
	if(field[ny][nx] != field[y][x]) break;
	if(con + 1>= n) return true;
      }

      if(con >= n) return true;
    }
  }

  return false;
}
*/

bool annihilation(vector<string> &field, int y, int x){
  if(field[y][x] == '.') return false;
  
  int dxy[2] = {0,1};
  
  for(int i = 0; i < 2; i++){
    int ty = dxy[i], tx = dxy[1-i];
    int con = 1;
    
    for(int nx = x + tx, ny = y + ty; 0 <= nx && nx < w && 0 <= ny && ny < h; nx += tx, ny += ty){
      if(field[ny][nx] != field[y][x]) break;
      con++;
    }
    tx *= -1, ty *= -1;
    for(int nx = x + tx, ny = y + ty; 0 <= nx && nx < w && 0 <= ny && ny < h; nx += tx, ny += ty){
      if(field[ny][nx] != field[y][x]) break;
      con++;
    }

    if(con >= n) return true;
  }

  return false;
}

bool check(vector<string> field){

  for(int i = 0; i < w; i++){
      for(int j = 0, k = 0; j < h; j++){
	if(field[h-1-j][i] != '.') continue;
	for(k = max(j+1,k); k < h; k++){
	  if(field[h-1-k][i] != '.'){
	    swap(field[h-1-j][i], field[h-1-k][i]);
	    break;
	  }
	}
	if(k == h) break;
      }
    }
  
  while(true){
    bool flag[MAX][MAX] = {}, cont = false;
    int con = 0;
    
    for(int i = 0; i < h; i++){
      for(int j = 0; j < w; j++){
	if(annihilation(field,i,j)){
	  flag[i][j] = true;
	  cont = true;
	}
	if(field[i][j] == '.' || flag[i][j] == true) con++;
	
      }
    }

    if(con == h*w) return true;
    if(!cont) return false;
    
    for(int i = 0; i < h; i++){
      for(int j = 0; j < w; j++){
	if(flag[i][j]){
	  field[i][j] = '.';
	}
      }
    }

    for(int i = 0; i < w; i++){
      for(int j = 0, k = 0; j < h; j++){
	if(field[h-1-j][i] != '.') continue;
	for(k = max(j+1,k); k < h; k++){
	  if(field[h-1-k][i] != '.'){
	    swap(field[h-1-j][i], field[h-1-k][i]);
	    break;
	  }
	}
	if(k == h) break;
      }
    }
  }
  
  return false;
}

signed main(){

  vector<string> field;
  
  cin>>h>>w>>n;

  field.resize(h);

  for(int i = 0; i < h; i++){
    cin>>field[i];
  }
  /*
   if(check(field)){
     cout<<"YES"<<endl;
     return 0;
   }
  */
   
   for(int i = 0; i < h; i++){
    for(int j = 0; j < w-1; j++){
      // if(field[i][j] == '.' || field[i][j+1] == '.') continue;
      
      if(field[i][j] == '.' && field[i][j+1] == '.') continue;
      
      swap(field[i][j],field[i][j+1]);

      if(check(field)){
	cout<<"YES"<<endl;
	return 0;
      }
      
      swap(field[i][j],field[i][j+1]);
    }
  }

  cout<<"NO"<<endl;
  
  return 0;
}

