【NOIP2017提高组模拟12.18】B

来源:互联网 发布:淘宝怎么换支付宝绑定 编辑:程序博客网 时间:2024/06/01 10:27

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");}}
1 0