Codeforces Round #744 (Div. 3)-C
阿新 • • 發佈:2021-11-29
題目
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; }