题目描述

由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向。现要求把闭合圈内的所有空间都填写成22.例如:6 \times 66×6的方阵(n=6n=6),涂色前和涂色后的方阵如下:

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

输入格式

每组测试数据第一行一个整数n(1 \le n \le 30)n(1≤n≤30)

接下来nn行,由00和11组成的n \times nn×n的方阵。

方阵内只有一个闭合圈,圈内至少有一个00。

//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)

输出格式

已经填好数字22的完整方阵。

输入输出样例

输入 #1复制

6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
输出 #1复制

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

说明/提示

1 \le n \le 301≤n≤30


题解

这道题有一个简单的算法就是输入时将所有为0的数据都填写为2,然后从4个边向内部进行BFS,如果搜索到2就将其改为0,并继续搜索,如果搜索到1或0就停止搜索。

 #include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <string.h> using namespace std; const int MAXN = ;
int n, map[MAXN][MAXN], vis[MAXN][MAXN];
int pos[][] = {, , , -, , , -, }; struct Node
{
int x, y;
}; Node q[MAXN];
int front, rear;
int a, b; void bfs()
{
Node now;
now.x = a;
now.y = b;
if(map[a][b] != )
{
return;
}
front = rear = ;
q[rear] = now;
rear++;
while(front < rear)
{
now = q[front++];
if(map[now.x][now.y] == )
{
map[now.x][now.y] = ;
}
if(now.x == )
{
now.x = ;
}
for(int i = ; i < ; i++)
{
int nx = now.x + pos[i][];
int ny = now.y + pos[i][];
if(nx <= n && nx > && ny <= n && ny >
&& vis[nx][ny] == false
&& map[nx][ny] == )
{
map[nx][ny] = ;
vis[nx][ny] = true;
q[rear].x = nx;
q[rear].y = ny;
rear++;
}
}
}
} int main()
{
cin >> n;
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)
{
cin >> map[i][j];
if(map[i][j] == )
{
map[i][j] = ;
}
}
}
for(int i = ; i <= n; i++)
{
a = ;
b = i;
bfs();
}
for(int i = ; i <= n; i++)
{
a = n;
b = i;
bfs();
}
for(int i = ; i <= n; i++)
{
a = i;
b = ;
bfs();
}
for(int i = ; i <= n; i++)
{
a = i;
b = n;
bfs();
}
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)
{
cout << map[i][j] << " ";
}
cout << endl;
}
return ;
}

这个BFS并不难写,不过当时犯了一个小错误,导致2/3/4个样例都是WA,特别是第2个样例在本机输出的结果和标准答案一致,但是提交后总是说一个位置应该为0,输出了2。查了很久,最后发现是把pos[4][2]写成了pos[2][4]。数组定义错了,导致遍历时移动的位置错误了,而且本机的对应内存的数据和测试机不同,所以在本机上是过了,但是测试机没有过。

洛谷 P1162 填涂颜色题解的更多相关文章

  1. 洛谷 P1162 填涂颜色 DFS

    P1162 填涂颜色 https://www.luogu.com.cn/problem/P1162 qaq搜索好抽象啊,蒟蒻表示难以理解,搞半天才做出来一道题,很挫败www 思路 染色法.找墙壁外的连 ...

  2. 洛谷P1162—填涂颜色

    这应该是是第一次记录洛谷题库里的题目吧: 题目描述 由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向.现要求把闭合圈内的所有空间都填写成22.例如:6 \ ...

  3. 洛谷 P1162 填涂颜色

    题目链接:https://www.luogu.org/problemnew/show/P1162 题目描述由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要 ...

  4. 洛谷 P1162 填涂颜色【DFS】

    题目链接:https://www.luogu.org/problemnew/show/P1162 题目描述 由数字 0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 1 构成,围圈时只走上下左右 4 ...

  5. 洛谷—— P1162 填涂颜色

    https://www.luogu.org/problem/show?pid=1162 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭 ...

  6. 洛谷P1162 填涂颜色【bfs】

    题目链接:https://www.luogu.org/problemnew/show/P1162 题意: 有一个0和1组成的矩阵,一些1组成一个闭合圈,圈住一些0,现在要把被圈住的这些0变成2输出. ...

  7. 洛谷P1162 填涂颜色

    题目链接:https://www.luogu.org/problemnew/show/P1162 这道题是LITTLESUN写的第一道BFS哦! 对于这道题的的思路是把封闭图形外边的0标记一边,在最后 ...

  8. 洛谷 - P1162 - 填涂颜色 - 简单搜索

    https://www.luogu.org/problemnew/show/P1162 在外面加一圈0把0连起来,然后把所有0换成2,再从(0,0)把连通的2全部改回来. 这也是一个判断内外圈的好办法 ...

  9. luogu P1162 填涂颜色 x

    P1162 填涂颜色 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和 ...

随机推荐

  1. sublime插件开发: 文件说明

    sublime插件开发 文件 .sublime-settings 设置文件 Main.sublime-menu 主菜单按钮配置文件 Side Bar.sublime-menu 侧边栏菜单文件列表,选中 ...

  2. 每日一问:详细说一下 MeasureSpec.UNSPECIFIED

    详细说一下 MeasureSpec.UNSPECIFIED 前面的文章 我留下了一个疑惑,那就是到底为什么 NestedScrollView 要把子 View 的测量模式强行设置为 MeasureSp ...

  3. SpringMVC拦截器与SpringBoot自定义拦截器

    首先我们先回顾一下传统拦截器的写法: 第一步创建一个类实现HandlerInterceptor接口,重写接口的方法. 第二步在XML中进行如下配置,就可以实现自定义拦截器了 SpringBoot实现自 ...

  4. Java判断文件类型

    通常,在WEB系统中,上传文件时都需要做文件的类型校验,大致有如下几种方法: 1. 通过后缀名,如exe,jpg,bmp,rar,zip等等. 2. 通过读取文件,获取文件的Content-type来 ...

  5. docker 学习操作记录 5-1

    记录5-1 [BEGIN] // :: Connecting to ... Connection established. To escape to local shell, press Ctrl+A ...

  6. Apache信息头

    package org.apache.http; public final class HttpHeaders { public static final String ACCEPT = " ...

  7. 设置KAFKA

    让我们继续下载并设置Kafka,启动zookeeper,集群,生产者和消费者.   要下载Kafka,请参阅此链接  http://kafka.apache.org/downloads.html 下载 ...

  8. C语言交换两个指针所指位置的数值

    交换指针变量x和y所指向的存储位置处存放的值,不需要第三个位置来存储临时变量.这种方式并没有性能上的优势. void replace(int *x, int *y) { *y = *x ^ *y; * ...

  9. Go在windows下执行命令行指令

    需要在Go写的服务里面调用命令行或者批处理,并根据返回的结果做处理. 在网上搜索了一翻,验证成功,现记录如下: cmd := exec.Command("cmd") // cmd ...

  10. 阿里 P8 高级架构师吐血总结的 《Java 核心知识整理&面试.pdf》| 免费分享

    最近在网上发现一份非常棒的 PDF 资料,据说是阿里 P8 级高级架构师吐血总结的, 其中内容覆盖很广,包括 Java 核心基础.Java 多线程.高并发.Spring.微服务.Netty 与 RPC ...