Codeforces Round #744 (Div. 3)-C
题目
https://codeforces.com/contest/1579/problem/C
思路
直接遍历,把每一个\('*'\)看作三角形的最下面的尖尖。
判断行不行,行的话把这个勾\(bool\)下
代码
//对于每一个钩,最短的也要大于k
//遍历一遍黑点 以最下面的点为起始点, 找到符合要求的后把符合要求的全bool标记
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 21;
char a[N][N];
bool b[N][N];
int T, m, n, k;
bool check_not(int x, int y)
{
return !(x >= 0 && x < m && y >= 0 && y < n && a[x][y] == '*');
}
void dfs(int i, int j)
{
int step = -1;
int x1 = i, x2 = i, y1 = j, y2 = j;
for(; ;)
{
if(check_not(x1, y1) || check_not(x2, y2)) break; //越界 或 到头
x1 -= 1;
y1 -= 1;
x2 -= 1;
y2 += 1;
step ++;
}
if(step >= k)
{
b[i][j] = true;
for(int z = 1; z <= step; ++ z)
{
b[i-z][j-z] = true;
b[i-z][j+z] = true;
}
}
}
int main()
{
cin >> T;
while(T --)
{
memset(a, 0, sizeof a);
memset(b, 0, sizeof b);
cin >> m >> n >> k;
for(int i = 0; i < m; ++ i) for(int j = 0; j < n; ++ j) cin >> a[i][j];
//找每一个点, 将其看作成最下方的点
for(int i = 0; i < m; ++ i)
for(int j = 0; j < n; ++ j)
if(a[i][j] == '*')
{
//将其向两边拓展,如果长度能达到k就将这一个区域全标true
dfs(i, j);
}
//找一遍,看有没有找完
int f = 0;
for(int i = 0; i < m; ++ i)
{
for(int j = 0; j < n; ++ j)
{
if(a[i][j] == '*' && !b[i][j])
{
puts("NO");
f = 1;
break;
}
}
if(f) break;
}
if(!f) puts("YES");
}
return 0;
}

浙公网安备 33010602011771号