【题目描述】

在两个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. MySql5.7.28下载、安装、登陆详解

    进入MySql官网下载,页面如下 根据自己需求,选择适合自己的进行下载 然后解压安装包到自己的喜欢的路径 配置环境变量 添加环境系统变量 MYSQL_HOME:D:\Program Files\mys ...

  2. js事件的三个阶段

    js事件的三个阶段分别为:捕获.目标.冒泡 1.捕获:事件由页面元素接收,逐级向下,到具体的元素 2.目标:具体的元素本身 3.冒泡:跟捕获相反,具体元素本身,逐级向上,到页面元素 IE5.5:div ...

  3. CrawlSpiders简介

    转:https://www.cnblogs.com/ellisonzhang/p/11124516.html#4295547 一.CrawlSpiders类简介 通过下面的命令可以快速创建 Crawl ...

  4. postgresql自增字段初始值的设定

    在实际开发中会有这样的需求,想要自己设置表中自增字段的初始值. 比如:有一个your_table表中有一个自增字段id,我们知道,插入数据后,默认是从1开始自增的. 但是假如现在有一个需求,是要求id ...

  5. 使用MySql对IdentityServer4进行持久化

    哈喽大家好,看见网上很少有使用MySql进行持久化的,毕竟又很多坑,说句实话,就连 MySql.Data.EntityFrameworkCore 都有问题,不知道是.net core更新太快还是其它的 ...

  6. 深入理解计算机系统 (CS:APP) Lab2 - Bomb Lab 解析

    原文地址:https://billc.io/2019/04/csapp-bomblab/ 写在前面 CS:APP是这学期的一门硬核课程,应该是目前接触到最底层的课程了.学校的教学也是尝试着尽量和CMU ...

  7. JavaScript数组排序(冒泡排序、选择排序、桶排序、快速排序)

    * 以下均是以实现数组的从小到大排序为例 1.冒泡排序 先遍历数组,让相邻的两个元素进行两两比较 .如果要求小到大排:最大的应该在最后面,如果前面的比后面的大,就要换位置: 数组遍历一遍以后,也就是第 ...

  8. Github Pages访问太慢?通过Netlify免费加速

    github pages vs netlify Github Pages为Github提供的一项静态站点托管服务,它直接从Github仓库获取静态文件进行发布,然后提供一个github.io的二级域名 ...

  9. 什么是Hibernate

    Hibernate是一个基于JDBC的主流持久性框架,是一个优秀的ORM(object relation mapping)(对象关系映射)实现 ORM就是通过java对象映射到数据库表中,通过操作ja ...

  10. Mac brew命令的使用

    mac 终端程序管理工具 能让你更快速的安装你想要的工具.而不用考虑大量的依赖. 安装brew复制下面的命令,终端执行  官网Homebrew /usr/bin/ruby -e "$(cur ...