【题目描述】

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

输入格式

第一行两个整数n,m

接下来一个n*m的01矩阵,共n行,每行m个数字,每个数字之间无空格,0表示没有同时被染色,1表示在两个网格中同时被染色。

输出格式

如果有解,则输出两个n*m的01矩阵,分别表示两个矩阵的染色情况,数字之间无空格,两个矩阵之间有一行空行

如果无解输出一行一个-1

样例输入

5 5

00000

01010

00000

01010

00000

样例输出

00000

01110

00010

01110

00000

01110

01010

01000

01010

01110

样例解释

第一个网格的染色       第二个网格的染色       紫色为在两个网格都染色的部分

(蓝色部分为四联通块) (红色部分为四联通块)

数据范围

对于20%的数据,n*m<=12

对于另外30%的数据,保证在两个矩阵都被染色的位置也是一个四联通块

对于100%的数据,n,m<=500

【思路】

这个题的题意有点皮,要多读几次才理解(当然大佬都是一看就懂QAQ)

20%的数据之间暴力就行,另外30%的数据其实直接输出你输入的矩阵两次就行

100%的数据的做法是玄学,大佬们管着叫构造(原谅我学识短不知道QAQ,我还以为是反向的模拟)

正解:

直接构造答案两个图的模版,构造的要求是两个图模板互不重合,但是能和除开边界的所有的格子相邻(因为重合点是不会出现在边界)

然后就可以开始愉快的构造了

这个构造首先是边界一圈两个图各分一半,然后内部二分给两家,保证一个图和另一个图除开边界的点相邻

然后无论重合点在哪都可以满足

构造的方式很多种,我举一个我自己的例子

橙色为答案图1,紫色为答案图2

然后你可以随意在非边界格子里选几个作为重合格子,只需要在这两张图中将重复格子赋值为1输出就行

答案初始图(以图片为例子)

11111 0          000001

101010          010101

101010          010101

101010          010101

101010          010101

100000          111110

然后假如我们输入的是

000000

010010

000000

010010

000000

000000

所以只需要在对应的初始图的点上赋值为1,然后输出图就行

输出:

11111 0          000001

1100          0011

101010          010101

1100          0011

101010          010101

100000          111110

我把重合点用红色写

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<algorithm>
#include<cstdlib>
#define maxn 505
using namespace std; int n,m;
int ans1[maxn][maxn];
int ans2[maxn][maxn]; int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} void init(){
n=read();m=read();
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)ans1[i][j]=;
for(int i=;i<=n;i++)ans1[i][m]=,ans2[i][m]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j+=)
ans1[i][j]=,ans2[i][j]=;
for(int i=;i<=m;i++)ans1[n][i]=,ans2[n][i]=;
} void show(){
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
printf("%d",ans1[i][j]);
}printf("\n");
}
printf("\n");
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
printf("%d",ans2[i][j]);
}printf("\n");
}
} void input(){
char ch=getchar();
for(int i=;i<=n;i++){
int j=;
while(ch<''||ch>''){ch=getchar();}
while(ch>=''&&ch<=''){
if(ch=='')
ans1[i][j]=,ans2[i][j]=;
ch=getchar();j++;}
}
} int main(){
init();
input();
show();
}

【总结】

构造很奇妙,需要脑回路清奇

[noip模拟]B<构造>的更多相关文章

  1. NOI.AC NOIP模拟赛 第一场 补记

    NOI.AC NOIP模拟赛 第一场 补记 candy 题目大意: 有两个超市,每个超市有\(n(n\le10^5)\)个糖,每个糖\(W\)元.每颗糖有一个愉悦度,其中,第一家商店中的第\(i\)颗 ...

  2. 2014-10-31 NOIP模拟赛

        10.30 NOIp  模拟赛   时间 空间 测试点 评测方式 挖掘机(dig.*) 1s 256M 10 传统 黑红树(brtree.*) 2s 256M 10 传统 藏宝图(treas. ...

  3. NOIP模拟赛 6.29

    2017-6-29 NOIP模拟赛 Problem 1 机器人(robot.cpp/c/pas) [题目描述] 早苗入手了最新的Gundam模型.最新款自然有着与以往不同的功能,那就是它能够自动行走, ...

  4. noip模拟44[我想我以后会碰见计数题就溜走的]

    noip模拟44 solutions 这一场抱零的也忒多了,我也只有45pts 据说好像是把几套题里面最难的收拾出来让我们考得 好惨烈啊,这次的考试我只有第一题骗了40pts,其他都抱零了 T1 Em ...

  5. noip模拟33

    \(\color{white}{\mathbb{失足而坠千里,翻覆而没百足,名之以:深渊}}\) 这场考试的时间分配非常不科学 开题试图想 \(t1\) 正解,一个半小时后还是只有暴力,特别惊慌失措 ...

  6. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  7. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  8. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  9. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

随机推荐

  1. MVC07

    1. 讲解ASP.net MVC的I/O操作 新建一个控制台程序,输入代码如下 using System; using System.IO; namespace IO { class Program ...

  2. element ui table render-header自定义表头信息使用

    在使用vue自定义组件内容过程之中,我们绝大多数情况下都是通过预先写好不同的html模板,再通过props传入不同的值来渲染不同的模板.例如我们需要实现一个<v-title size='1'&g ...

  3. 沃土前端系列 - HTML常用标签

    html是什么 HTML是Hyper Text Markup Language的缩写,中文的意思是"超文本标记语言",它是制作网页的标准语言.由于网页中不仅包含普通文本,还包含超文 ...

  4. Python - requests发送请求报错:UnicodeEncodeError: 'latin-1' codec can't encode characters in position 13-14: 小明 is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.

    背景 在做接口自动化的时候,Excel作为数据驱动,里面存了中文,通过第三方库读取中文当请求参数传入 requests.post() 里面,就会报错 UnicodeEncodeError: 'lati ...

  5. spring boot 整合elasticsearch

    1.导入jar包 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncodi ...

  6. vue 点击跳转路由设置

    刚接触 知道有两种方法,一种是用路由,一种是原生js的 <a @click="handleClick"></a> methods:function(){ h ...

  7. Javascript中的Math.max()和Math.min()

    Math.max()是求最大值,Math.min()是求最小值 Math.max(value1,value2,value3....) 但是如果是数组或者对象呢? var numArr = [1,2,4 ...

  8. ubuntu16.04 + caffe + SSD 硬件配置

    搞了几个月,终于把SSD试通了,不是科班出身的就是弯路多啊.几个月才跑通了caffe + ssd,痛苦至极,好在柳暗花明.好了,废话不多说,入正题. SSD作为object detection的论文, ...

  9. 精通HTML DOM

    DOM 1. 属性方法 类型/返回类型 说明 nodeName String 节点名称,根据节点的类型而定义 nodeValue string 节点的值,同样根据节点的类型而定义 nodeType s ...

  10. python pip 更新失败问题

    通过PIP 安装第三方库的时候出现 pip程序版本过旧,用’python -m pip install --upgrade pip‘安装’提示仍然如下 可以用管理员身份运行windows shell  ...