题解: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;
}
posted @ 2025-02-06 15:33  chaqjs  阅读(83)  评论(0)    收藏  举报