专栏文章
题解:P13371 [GCJ 2011 #1C] Square Tiles
P13371题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @miosjz90
- 此快照首次捕获于
- 2025/12/03 00:27 3 个月前
- 此快照最后确认于
- 2025/12/03 00:27 3 个月前
P13371 —Square Tiles 题解
前言
这道题还是比较水的(而我两遍才过),不过还是有需要注意的坑点,数据范围不大,时间和空间限制也很宽泛,给了我们广阔的发挥空间,在此,我就讲一种简单的做法。(建议使用字符数组)
正文
也许很多人第一想到的是特判 impossible 的情况(至少我是这样),但这样特判码量大且易错。因此,我们不妨先进行替换操作,再判断是否全部替换成功即可。
显然,每遍历到一个字符时只需要查看它的左,下,左下三个方向上包括自己是不是都满足为 # ,如果是,就把它们全部替换,直接更新在数组中,现在就体现出用数组而非字符串的优势了。
显然,每遍历到一个字符时只需要查看它的左,下,左下三个方向上包括自己是不是都满足为 # ,如果是,就把它们全部替换,直接更新在数组中,现在就体现出用数组而非字符串的优势了。
代码
CPP
#include<bits/stdc++.h>//可爱的万能头
using namespace std;
const int N=100;//数组略微开大点没坏处
char a[N][N];
int t,n,m;//表示n行m列,个人习惯用n,m
bool vis;//只标记有或没有,用bool省空间(虽然这道题不用省)
int main() {
ios::sync_with_stdio(false);//关闭流同步,可以提高cin,cout的速度
cin.tie(NULL),cout.tie(NULL);
cin>>t;
for(int k=1; k<=t; k++) {//为了方便记录组数,用for而不是while
cin>>n>>m;
vis=0;//多测一定要清空标记
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin>>a[i][j]; //个人建议先输入再输出组数,看着明了点
}
}
cout<<"Case #"<<k<<":"<<'\n';
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
if(a[i][j]=='#'&&a[i][j+1]=='#'&&a[i+1][j]=='#'&&a[i+1][j+1]=='#') {//判断是否又满足条件的联通块
a[i][j]='/',a[i][j+1]='\\',a[i+1][j]='\\',a[i+1][j+1]='/';//依题更新
// 单独一个 \ 后面跟字符 会构成特殊的转义序列,所以要写成 '\\'
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) if(a[i][j]=='#') vis=1;//看看还有没有蓝色没被更新
}
if(vis==1) cout<<"Impossible"<<'\n';//如果有,那么就不可能满足了
else {
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) cout<<a[i][j];//如果没有蓝色了,说明满足题意,输出结果
cout<<'\n';//因为关闭了流同步,所以建议使用 \n
}
}
}
return 0;
}
//完结撒花 ~
蒟蒻第一次发题解,望亲爱的管理员通过
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...