题解:AT_abc390_c [ABC390C] Paint to make a rectangle
额这篇和下一篇当初不知道为什么没有放到博客园上,现在才想起来,见谅。
题目翻译
你将得到一个由 \(H\) 行和 \(W\) 列组成的网格。
设 \((i,j)\) 表示顶部的第 \(i\) 行(\(1 \leq i \leq H\))和左侧的第 \(j\) 列(\(1 \leq j \leq W\))处的单元格。
网格的状态由 \(H\) 字符串 \(S_1, S_2, \ldots, S_H\) 表示,每个字符串的长度为 \(W\),如下所示:
-
如果 \(S_i\) 的第 \(j\) 个字符是
#,单元格 \((i,j)\) 被涂成黑色。 -
如果 \(S_i\) 的第 \(j\) 个字符是
.,单元格 \((i,j)\) 被涂成白色。 -
如果 \(S_i\) 的第 \(j\) 一个字符是
?,单元格 \((i,j)\) 尚未绘制。
高桥想把每个还没有被涂上颜色的单元格涂成白色或黑色,这样所有的黑色单元格就形成了一个矩形。
高桥想把每个还没有被涂上颜色的单元格涂成白色或黑色,这样所有的黑色单元格就形成了一个矩形。
更准确地说,他希望存在一个四元组整数 \((a,b,c,d)\)( \(1 \leq a \leq b \leq H\) , \(1 \leq c \leq d \leq W\)),这样:
对于每个单元格 \((i,j)\)(\(1 \leq i \leq H, 1 \leq j \leq W\)),如果 \(a \leq i \leq b\) 和 \(c \leq j \leq d\),单元格为黑色;
否则,单元格为白色。
请确定这是否可能。
解题思路
我们要找到一个黑色矩形,所以我们直接枚举整个网格,找到能成为矩形的黑色单元格的左上角和左下角,然后再枚举整个矩形若里面有白色单元格,则说明一定不能构成矩形,反之说明能构成矩形。
代码实现
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int h, w;
char s[N][N];
int main(){
cin.tie(0)->sync_with_stdio(0);
cin >> h >> w;
for (int i = 1; i <= h; i++)
for (int j = 1; j <= w; j++)
cin >> s[i][j];
int x = 0x3f3f3f3f, y = 0x3f3f3f3f, m = -1, n = -1;
// 找到左上角和左下角
for (int i = 1; i <= h; i++){
for (int j = 1; j <= w; j++){
if (s[i][j] == '#'){
x = min(x, i);
y = min(y, j);
m = max(m, i);
n = max(n, j);
}
}
}
// 枚举这个矩形
for (int i = x; i <= m; i++){
for (int j = y; j <= n; j++){
if (s[i][j] == '.'){
cout << "No";
return 0;
}
}
}
cout << "Yes";
return 0;
}

浙公网安备 33010602011771号