题目描述
输入描述
输出描述
输入样例
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;
}