Matrix Problem
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
000
4 4
0000
0110
0000
0000
11 11
00000000000
01111011110
01000000010
01011111010
01010001010
01010101010
01010001010
01011011010
01000000010
01111111110
00000000000
111111
100001
100001
100101
101001
100001
111111
000000
011110
011110
011110
011110
011110
000000
*/
以上是关于Matrix Problem的主要内容,如果未能解决你的问题,请参考以下文章
小Z的房间[HEOI2015] (matrix-tree定理)
杭电2018多校第四场(2018 Multi-University Training Contest 4) 1005.Problem E. Matrix from Arrays (HDU6336) -
HDU3666 THE MATRIX PROBLEM (差分约束+取对数去系数)(对退出情况存疑)