专栏文章

题解: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 条评论,欢迎与作者交流。

正在加载评论...