2021ICPC山东省赛 M. Matrix Problem(构造)

传送门

题目描述

在这里插入图片描述

输入描述

在这里插入图片描述

输出描述

在这里插入图片描述

输入样例

5 5
00000
00100
01010
01100
00000

输出样例

11110
10100
11110
11100
11110
00001
01111
01011
01111
00001

题目大意: 给定二维的数组 c,要求当 c 的某处为 1 时,数组 a 和 b 的对应位置均为 1 ,且数组 a 和 b 中的 1 需要连通。

可以发现数组 a 和 b 需要进行取反处理,因为当 c 为 0 时,显然数组 a 和 b 不能同时为 1,否则对应的 c 应该为 1。可以利用数组 c 的四周均为 0 的条件使得数组 a 和 b 连通,即:对于奇数行,数组 a 全为 1;对于偶数行,数组 b 全为 0 (均为不包括左右两端的情况)。同时令数组 a 的最左一列全为 1,数组 b 的最右一列全为 1 即可。这样可以保证对于数组 c 中的每一个 1,都能在其上或其下一行与任一数组连通,而两侧的列可以保证行不会出现孤立情况。

参考代码

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N=505;
int a[N][N],b[N][N],c[N][N];

int main(){
    
    
	int n,m;
	cin>>n>>m;
	string s[N];
	for(int i=1;i<=n;i++)
		cin>>s[i];
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			c[i][j]=s[i][j-1]-'0';

	for(int i=2;i<=n-1;i++)
		for(int j=2;j<=m-1;j++)
			if(c[i][j]==1)
				a[i][j]=b[i][j]=1;

	
	for(int i=1;i<=n;i++)
		if(i%2==1)
			for(int j=2;j<=m-1;j++)
				a[i][j]=1;


	for(int i=1;i<=n;i++)
		if(i%2==0)
			for(int j=2;j<=m-1;j++)
				b[i][j]=1;
	
	for(int i=1;i<=n;i++)
		a[i][1]=1,b[i][m]=1;
	
	for(int i=1;i<=n;i++){
    
    
		for(int j=1;j<=m;j++)
			cout<<a[i][j];
		cout<<endl;
	}
//	cout<<endl;
	for(int i=1;i<=n;i++){
    
    
		for(int j=1;j<=m;j++)
			cout<<b[i][j];
		cout<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/laysan/article/details/121405642