#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <algorithm>
#include <sstream>
#include <map>
#include <set>

#define REP(i,k,n) for(int i=k;i<n;i++)
#define rep(i,n) for(int i=0;i<n;i++)
#define INF 1<<30
#define pb push_back
#define mp make_pair

using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int h, w, n;

int sx,sy,gx,gy;
int dx[4] = {1,-1, 0, 0};
int dy[4] = {0, 0, 1,-1};
vector<string> s;
bool used[35][35], used2[35][35];

bool can(int y,int x) {
	if(0 <= y && y < h && 0 <= x && x < w) return true;
	return false;
}

bool func(vector<string> t) {

	for(int i = h - 1; i >= 0; i--) {
		for(int j = w - 1; j >= 0; j--) {
			if(t[i][j] == '.') continue;

			int k = i;
			while(can(k+1, j) && t[k+1][j] == '.') {
				swap(t[k][j], t[k+1][j]);
				k++;
			}
		}
	}

	while(true) {
		bool flag = false;
		memset(used, 0, sizeof(used));
		memset(used2, 0, sizeof(used2));

		for(int i = h-1; i >= 0; i--) {
			for(int j = w-1; j >= 0; j--) {
				if(t[i][j] == '.') continue;

				if(!used[i][j]) {
					int len = 1;
					int k = j+1;
					while(can(i, k) && t[i][k] == t[i][j]) {
						len++;
						k++;
					}

					k = j-1;
					while(can(i, k) && t[i][k] == t[i][j]) {
						len++;
						k--;
					}

					if(len >= n) {
						flag = true;
						used[i][j] = true;
						k = j + 1;
						while(can(i, k) && t[i][k] == t[i][j]) {
							used[i][k] = true;
							k++;
						}

						k = j - 1;
						while(can(i, k) && t[i][k] == t[i][j]) {
							used[i][k] = true;
							k--;
						}
					}
				}

				if(!used2[i][j]) {
					int len = 1;
					int k = i + 1;
					while(can(k, j) && t[k][j] == t[i][j]) {
						len++;
						k++;
					}

					k = i - 1;
					while(can(k, j) && t[k][j] == t[i][j]) {
						len++;
						k--;
					}

					if(len >= n) {
						flag = true;
						used2[i][j] = true;
						k = i + 1;
						while(can(k, j) && t[k][j] == t[i][j]) {
							used2[k][j] = true;
							k++;
						}

						k = i - 1;
						while(can(k, j) && t[k][j] == t[i][j]) {
							used2[k][j];
							k++;
						}
					}
				}
			}
		}

		// cout << " pre ---- " << endl;
		// rep(i, h) cout << t[i] << endl;

		rep(i, h) {
			rep(j, w) {
				if(used[i][j] || used2[i][j]) t[i][j] = '.';
			}
		}

		// cout << " delete ---- " << endl;
		// rep(i, h) cout << t[i] << endl;

		for(int i = h - 1; i >= 0; i--) {
			for(int j = w - 1; j >= 0; j--) {
				if(t[i][j] == '.') continue;

				int k = i;
				while(can(k+1, j) && t[k+1][j] == '.') {
					swap(t[k][j], t[k+1][j]);
					k++;
				}
			}
		}

		// cout << " fall --- " << endl;
		// rep(i, h) cout << t[i] << endl;

		if(flag) continue;
		else break;
	}

	rep(i, h) {
		rep(j, w) {
			if(t[i][j] == '.') continue;
			return false;
		}
	}
	return true;
}

int main() {
	cin >> h >> w >> n;

	s.resize(h);
	rep(i, h) cin >> s[i];

	bool flag = false;
	rep(i, h) {
		rep(j, w) {
			if(s[i][j] == '.') continue;

			// cout << " --------------- i:" << i << " j:" << j << endl;
			if(j == 0) {
				swap(s[i][j], s[i][j+1]);
				flag |= func(s);
				swap(s[i][j], s[i][j+1]);
			} else if(j == w-1) {
				swap(s[i][j], s[i][j-1]);
				flag |= func(s);
				swap(s[i][j], s[i][j-1]);
			} else {
				swap(s[i][j], s[i][j+1]);
				flag |= func(s);
				swap(s[i][j], s[i][j+1]);
				swap(s[i][j], s[i][j-1]);
				flag |= func(s);
				swap(s[i][j], s[i][j-1]);
			}
		}
	}

	if(flag) cout << "YES" << endl;
	else cout << "NO" << endl;

	return 0;
}

Measured memory_bytes: 1216