using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static string InputPattern = "InputX";
static List<string> GetInputList()
{
var WillReturn = new List<string>();
if (InputPattern == "Input1") {
WillReturn.Add("2 4 5");
WillReturn.Add("BWW#");
WillReturn.Add("W#BB");
//Yes
}
else if (InputPattern == "Input2") {
WillReturn.Add("3 1 4");
WillReturn.Add("B");
WillReturn.Add("W");
WillReturn.Add("W");
//Yes
}
else if (InputPattern == "Input3") {
WillReturn.Add("2 5 3");
WillReturn.Add("BWW##");
WillReturn.Add("##WWB");
//No
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static int[] GetSplitArr(string pStr)
{
return (pStr == "" ? new string[0] : pStr.Split(' ')).Select(pX => int.Parse(pX)).ToArray();
}
static int mK;
static char[,] mBanArr;
static int UB_X;
static int UB_Y;
static void Main()
{
List<string> InputList = GetInputList();
int[] wkArr = GetSplitArr(InputList[0]);
mK = wkArr[2];
mBanArr = CreateBanArr(InputList.Skip(1));
UB_X = mBanArr.GetUpperBound(0);
UB_Y = mBanArr.GetUpperBound(1);
bool IsOK = false;
for (int Y = 0; Y <= UB_Y; Y++) {
for (int X = 0; X <= UB_X; X++) {
if (mBanArr[X, Y] == 'B') {
if (IsRinsetuW(X, Y)) {
IsOK = true;
}
}
}
}
if (IsOK == false) {
Console.WriteLine("No");
return;
}
// 場合1 K=2の場合
if (mK == 2) {
Console.WriteLine("Yes");
return;
}
// 場合2 Kが4以上の偶数の場合
if (mK % 2 == 0) {
if (ExecDFS4()) {
Console.WriteLine("Yes");
}
else {
Console.WriteLine("No");
}
return;
}
// 場合3 Kが奇数の場合
// レベルが奇数のときの最小レベル
int?[,] OddEdakiriArr = new int?[UB_X + 1, UB_Y + 1];
// レベルが偶数のときの最小レベル
int?[,] EvenEdakiriArr = new int?[UB_X + 1, UB_Y + 1];
var Que = new Queue<JyoutaiDef>();
JyoutaiDef WillEnqueue;
for (int Y = 0; Y <= UB_Y; Y++) {
for (int X = 0; X <= UB_X; X++) {
if (mBanArr[X, Y] == 'B') {
WillEnqueue.CurrX = X;
WillEnqueue.CurrY = Y;
WillEnqueue.Level = 0;
Que.Enqueue(WillEnqueue);
}
}
}
var OddLevelList = new List<int>();
while (Que.Count > 0) {
JyoutaiDef Dequeued = Que.Dequeue();
int CurrX = Dequeued.CurrX;
int CurrY = Dequeued.CurrY;
int CurrLevel = Dequeued.Level;
if (mBanArr[CurrX, CurrY] != 'B') {
if (CurrLevel % 2 == 1) {
if (OddEdakiriArr[CurrX, CurrY].HasValue) {
if (OddEdakiriArr[CurrX, CurrY] <= Dequeued.Level) {
continue;
}
}
OddEdakiriArr[CurrX, CurrY] = Dequeued.Level;
}
if (CurrLevel % 2 == 0) {
if (EvenEdakiriArr[CurrX, CurrY].HasValue) {
if (EvenEdakiriArr[CurrX, CurrY] <= Dequeued.Level) {
continue;
}
}
EvenEdakiriArr[CurrX, CurrY] = Dequeued.Level;
}
}
if (mBanArr[CurrX, CurrY] == 'B' && Dequeued.Level > 0) {
if (Dequeued.Level % 2 == 1 && Dequeued.Level >= 3) {
OddLevelList.Add(Dequeued.Level);
}
continue;
}
Action<int, int> EnqueueAct = (pNewX, pNewY) =>
{
if (pNewX < 0 || UB_X < pNewX) return;
if (pNewY < 0 || UB_Y < pNewY) return;
WillEnqueue.CurrX = pNewX;
WillEnqueue.CurrY = pNewY;
WillEnqueue.Level = Dequeued.Level + 1;
if (mBanArr[pNewX, pNewY] == '#') return;
Que.Enqueue(WillEnqueue);
};
EnqueueAct(CurrX, CurrY - 1);
EnqueueAct(CurrX, CurrY + 1);
EnqueueAct(CurrX - 1, CurrY);
EnqueueAct(CurrX + 1, CurrY);
}
if (OddLevelList.Count == 0) {
Console.WriteLine("No");
return;
}
if (OddLevelList.Min() <= mK) {
Console.WriteLine("Yes");
}
else {
Console.WriteLine("No");
}
}
static bool IsRinsetuW(int pBaseX, int pBaseY)
{
if (pBaseX > 0) {
if (mBanArr[pBaseX - 1, pBaseY] == 'W') return true;
}
if (pBaseX < UB_X) {
if (mBanArr[pBaseX + 1, pBaseY] == 'W') return true;
}
if (pBaseY > 0) {
if (mBanArr[pBaseX, pBaseY - 1] == 'W') return true;
}
if (pBaseY < UB_Y) {
if (mBanArr[pBaseX, pBaseY + 1] == 'W') return true;
}
return false;
}
struct JyoutaiDef
{
internal int CurrX;
internal int CurrY;
internal int Level;
}
// 4手で黒マスにこれるかを判定
static bool ExecDFS4()
{
var WillReturn = new List<JyoutaiDef>();
var Stk = new Stack<JyoutaiDef>();
JyoutaiDef WillPush;
for (int Y = 0; Y <= UB_Y; Y++) {
for (int X = 0; X <= UB_X; X++) {
if (mBanArr[X, Y] == 'B') {
WillPush.CurrX = X;
WillPush.CurrY = Y;
WillPush.Level = 0;
Stk.Push(WillPush);
}
}
}
while (Stk.Count > 0) {
JyoutaiDef Popped = Stk.Pop();
int CurrX = Popped.CurrX;
int CurrY = Popped.CurrY;
if (Popped.Level == 4) {
if (mBanArr[CurrX, CurrY] == 'B') {
return true;
}
continue;
}
Action<int, int, int> PushAct = (pNewX, pNewY, pNewLevel) =>
{
if (pNewX < 0 || UB_X < pNewX) return;
if (pNewY < 0 || UB_Y < pNewY) return;
if (1 <= pNewLevel && pNewLevel <= 3) {
if (mBanArr[pNewX, pNewY] != 'W') return;
}
else {
if (mBanArr[pNewX, pNewY] != 'B') return;
}
WillPush.CurrX = pNewX;
WillPush.CurrY = pNewY;
WillPush.Level = pNewLevel;
Stk.Push(WillPush);
};
PushAct(CurrX, CurrY - 1, Popped.Level + 1);
PushAct(CurrX, CurrY + 1, Popped.Level + 1);
PushAct(CurrX - 1, CurrY, Popped.Level + 1);
PushAct(CurrX + 1, CurrY, Popped.Level + 1);
}
return false;
}
////////////////////////////////////////////////////////////////
// IEnumerable<string>をcharの2次元配列に設定
////////////////////////////////////////////////////////////////
static char[,] CreateBanArr(IEnumerable<string> pStrEnum)
{
var StrList = pStrEnum.ToList();
if (StrList.Count == 0) {
return new char[0, 0];
}
int UB_X = StrList[0].Length - 1;
int UB_Y = StrList.Count - 1;
char[,] WillReturn = new char[UB_X + 1, UB_Y + 1];
for (int Y = 0; Y <= UB_Y; Y++) {
for (int X = 0; X <= UB_X; X++) {
WillReturn[X, Y] = StrList[Y][X];
}
}
return WillReturn;
}
}