思路
首先看到数据范围,观察到 n
、m
都不大,所以考虑模拟染色过程。
遍历每个点,然后枚举以该点为左上角的勾形的大小,如果可行,则将这块勾形区域标记。
最后遍历一遍原图,如果有没标记过的需染色点,则输出 NO
,否则输出 YES
。
代码
纯暴力,就按照思路中的流程来,所以不加注释。
#include <bits/stdc++.h>
using namespace std;
int t,n,m,k;
char c[30][30],f[30][30];
int main () {
cin>> t;
while (t--) {
cin>> n>> m>> k;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) {
cin>> c[i][j];
f[i][j]='.';
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) {
for (int u=k;i+u<=n&&j+2*u<=m;u++) {
bool fl=1;
int x=i,y=j;
for (int v=1;v<=u+1;v++) {
if (c[x][y]!='*') {
fl=0;
break;
}
x++;
y++;
}
x-=2;
for (int v=1;v<=u;v++) {
if (c[x][y]!='*') {
fl=0;
break;
}
x--;
y++;
}
if (fl) {
x=i;
y=j;
for (int v=1;v<=u+1;v++) {
f[x][y]='*';
x++;
y++;
}
x-=2;
for (int v=1;v<=u;v++) {
f[x][y]='*';
x--;
y++;
}
}
}
}
bool fl=1;
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++)
if (c[i][j]!=f[i][j]) {
fl=0;
break;
}
if (!fl) break;
}
puts (fl? "YES": "NO");
}
return 0;
}