题解:AT_abc390_c [ABC390C] Paint to make a rectangle
__camelia
·
·
题解
[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。