专栏文章

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

AT_abc390_c题解参与者 2已保存评论 2

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
2 条
当前快照
1 份
快照标识符
@miqe3b77
此快照首次捕获于
2025/12/04 03:18
3 个月前
此快照最后确认于
2025/12/04 03:18
3 个月前
查看原文

[ABC390C] Paint to make a rectangle

题意

有一个 HHWW 列的网格,若 (i,j)(i,j) (1iH,1jW)(1\le i\le H,1\le j\le W) 表示网格中第 ii 行,第 jj 列的单元格。 对于每个网格,有 .#?三种状态:
1.若该网格的状态为 .(i,j)(i,j) 被涂成白色;
2.若该网格的状态为 #(i,j)(i,j) 被涂成黑色;
3.若该网格的状态为 ?(i,j)(i,j) 尚未涂黑;  
将每个 ? 单元格涂成黑色或白色,使得所有的黑色单元格组成一个矩形。
HH , WW 1000\le 1000
题目中要求所有的黑色单元格组成一个矩形,所以在已经确定的黑色单元格 # 出现的上下左右界所框定的矩形中,必须全为 ?# ;换句话说,在这个矩形中若是出现 . 就可以肯定不存在满足题目要求的情况。
所以,我们可以在输入时找出黑色单元格 # 出现的上下左右界,再遍历这个矩形,判断是否出现了 .,最后输出答案就可以了。

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 记录
蒟蒻的第一篇题解,点个赞支持一下呗。 qwq。

评论

2 条评论,欢迎与作者交流。

正在加载评论...