Matrix Problem
题意:
给你一个n * m的二维数据c,c的每个元素值为0或1
现在要求你构造同样大小的数组a和b,要求c[i][j] =='1’的话,a[i][j] = b[i][j] = ‘1’,如果c[i][j] ==‘0’.a[i][j]!=b[i][j],且a和b中的1都是连通的,输出a和b任意一种情况
题解:
题目保证c的最外围是0,既然给了这个条件且题目没说构造不出a和b的情况,所以最外围保证了答案一定构成
我们先考虑a,只要a确定了,b就是取反(当然还要考虑c数组)
如何构造a?我们可以让a的最外围全是1,然后构造如果是偶数层就让a全等于1,奇数层全是0(也就是b全是1),
但有可能这样,蓝色部分为1,绿色部分为0,橙色部分为数组c等于1
这样蓝色是连通的,但是绿色被隔断了,b数组就不满足连通,如何让绿色部分连通?如果橙色部分在第三层就好了,所以当c[i][j] == ‘1’且i为奇数时,这一层才可以成1,因为这样上下两层才能通过橙块连通在一起
代码:
//蒟蒻三人行
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=700;
char c[maxn][maxn];
char a[maxn][maxn];
char b[maxn][maxn];
int main()
{int n,m;cin>>n>>m;char ch=getchar(); for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>c[i][j];}ch=getchar(); }for(int i=1;i<=n;i++){int ans=0;for(int j=1;j<=m;j++){if(i==1||i==n||j==1||j==m){a[i][j]='1';continue;}if(c[i][j]=='1'){ans++;a[i][j]='1';} }if(ans&&i%2==1){for(int j=2;j<m;j++)a[i][j]='1';}else {for(int j=2;j<m;j++)if(a[i][j]!='1')a[i][j]='0';}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(c[i][j]=='1')b[i][j]='1';else if(a[i][j]=='1')b[i][j]='0';else b[i][j]='1';}}
// cout<<"test"<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<a[i][j];} cout<<endl;}
// cout<<"test"<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cout<<b[i][j];} cout<<endl;}
}
/*
3 3
000
000
0004 4
0000
0110
0000
000011 11
00000000000
01111011110
01000000010
01011111010
01010001010
01010101010
01010001010
01011011010
01000000010
01111111110
00000000000111111
100001
100001
100101
101001
100001
111111000000
011110
011110
011110
011110
011110
000000
*/