【NOIP2017提高组模拟12.18】B

时间:2022-12-17 13:19:05

Description

在两个n*m的网格上染色,每个网格中被染色的格子必须是一个四联通块(没有任何格子被染色也可以),四联通块是指所有染了色的格子可以通过网格的边联通,现在给出哪些格子在两个网格上都被染色了,保证网格的最外围一层不会在两个网格中同时被染色,即所有处于第x行第y列满足x=1或x=n或y=1或y=m的格子不会被在两个网格中同时被染色,请求出任意一种染色的方案,如果无解,请输出-1。

Solution

这是一道奇妙的题目。
比赛的时候想到了可能是构造的方法,但是没有想到如何优美的构造,最后只能打了个60分的暴力。
为了保证联通,我们把第一列分给第一个矩阵,最后一列分给第二个矩阵,然后奇数行分给第一个矩阵,偶数行分给第二个矩阵,这样可以先保证矩阵是联通的而且不相交,然后再把矩阵之间重叠的部分,加上去就好了。

Code

#include<iostream>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include<math.h>
#define fo(i,a,b) for(i=a;i<=b;i++)
const int maxn=507;
using namespace std;
int i,j,k,l,t,n,m,ans,sx,sy,tot,x,y;
char s[maxn][maxn];
int a[maxn][maxn],b[maxn][maxn];
int main(){
//freopen("fan.in","r",stdin);
scanf("%d%d",&n,&m);
fo(i,1,n){
scanf("%s",s[i]+1);
fo(j,1,m)if(s[i][j]=='1')a[i][j]=b[i][j]=1;
}
fo(i,1,n){
if(i%2)fo(j,1,m)a[i][j]=1;
else fo(j,1,m)b[i][j]=1;
}
fo(i,1,n)a[i][1]=b[i][m]=1,a[i][m]=b[i][1]=0;
fo(i,1,n){fo(j,1,m)printf("%d",a[i][j]);printf("\n");}
printf("\n");
fo(i,1,n){fo(j,1,m)printf("%d",b[i][j]);printf("\n");}

}