题解:AT_abc390_c [ABC390C] Paint to make a rectangle

· · 题解

[ABC390C] Paint to make a rectangle

题目传送门

题意

有一个 H W 列的网格,若 (i,j) (1\le i\le H,1\le j\le W) 表示网格中第 i 行,第 j 列的单元格。 对于每个网格,有 .#?三种状态:

1.若该网格的状态为 .(i,j) 被涂成白色;
2.若该网格的状态为 #(i,j) 被涂成黑色;
3.若该网格的状态为 ?(i,j) 尚未涂黑;  

将每个 ? 单元格涂成黑色或白色,使得所有的黑色单元格组成一个矩形。

题目中要求**所有的**黑色单元格组成一个矩形,所以在已经确定的黑色单元格 `#` 出现的上下左右界所框定的矩形中,必须全为 `?` 与 `#` ;换句话说,在这个矩形中若是出现 `.` 就可以肯定不存在满足题目要求的情况。 所以,我们可以在输入时找出黑色单元格 `#` 出现的上下左右界,再遍历这个矩形,判断是否出现了 `.`,最后输出答案就可以了。 ## CODE: ```cpp #include<bits/stdc++.h> using namespace std; #define oo 0x3f3f3f3f char a[1005][1005]; int n,m; int mu=oo,md=-oo,ml=oo,mr=-oo;//初始化 int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>a[i][j]; if(a[i][j]=='#'){ mu=min(mu,i);//找出上下左右界 ml=min(ml,j); md=max(md,i); mr=max(mr,j); } } } for(int i=mu;i<=md;i++){ for(int j=ml;j<=mr;j++){ if(a[i][j]=='.'){//出现'.'就直接输出No cout<<"No"<<"\n"; return 0; } } } cout<<"Yes"<<"\n"; return 0; } ``` [AC 记录](https://www.luogu.com.cn/record/200570371) 蒟蒻的第一篇题解,点个赞支持一下呗。 qwq。