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;
}
posted @ 2021-11-29 18:34  birds_fly  阅读(40)  评论(0)    收藏  举报