1. 程式人生 > 其它 >Codeforces Round #744 (Div. 3)-C

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;
}