P1162 填涂颜色【解析】-----深度优先搜索

news/2024/11/29 22:44:03/

填涂颜色

题目描述

由数字 0 0 0 组成的方阵中,有一任意形状的由数字 1 1 1 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 2 2 2。例如: 6 × 6 6\times 6 6×6 的方阵( n = 6 n=6 n=6),涂色前和涂色后的方阵如下:

如果从某个 0 0 0 出发,只向上下左右 4 4 4 个方向移动且仅经过其他 0 0 0 的情况下,无法到达方阵的边界,就认为这个 0 0 0 在闭合圈内。闭合圈不一定是环形的,可以是任意形状,但保证闭合圈内 0 0 0 是连通的(两两之间可以相互到达)。

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

输入格式

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

接下来 n n n 行,由 0 0 0 1 1 1 组成的 n × n n \times n n×n 的方阵。

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

输出格式

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

样例 #1

样例输入 #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

提示

对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 30 1 \le n \le 30 1n30

题目分析1

如果我们按照常规思路去寻找闭合圈内任意一点,则需要将闭合圈外的点全部标记一遍,使之与闭合圈内的点分开。然后找到闭合圈内一点去进行洪水填充。需要进行两次深搜。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[35][35];
int n;
bool vis[35][35];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};void dfs1(int x,int y){vis[x][y]=1;//标记    for(int i=0;i<4;i++){int nx=x+dx[i];int ny=y+dy[i];if(nx<0||ny<0||nx>n+1||ny>n+1)continue;//外侧加了一圈0,使之连通if(vis[nx][ny]==1)continue;//已经在当前路径中	if(a[nx][ny]==1)continue;	dfs1(nx,ny); }
}
void dfs2(int x,int y){a[x][y]=2;//标记    for(int i=0;i<4;i++){int nx=x+dx[i];int ny=y+dy[i];if(nx<1||ny<1||nx>n||ny>n)continue;//出地图if(a[nx][ny]!=0)continue;	dfs2(nx,ny); }
}
void print(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cout<<a[i][j]<<" ";}cout<<endl;}	
}
int main(){cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];}}dfs1(0,0);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(!vis[i][j]&&a[i][j]==0){	dfs2(i,j);print();return 0;}}}return 0;
}

题目分析2

假设我们一开始将所有的0记为2,那么只需要对闭合圈外的2进行洪水填充即可,只需要使用一次深搜。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[35][35];
int n;
bool vis[35][35];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
void dfs(int x,int y){vis[x][y]=1;//标记    a[x][y]=0;for(int i=0;i<4;i++){int nx=x+dx[i];int ny=y+dy[i];if(nx<0||ny<0||nx>n+1||ny>n+1)continue;//出地图if(a[nx][ny]==1)continue;if(vis[nx][ny])continue;//已经在当前路径中dfs(nx,ny);   }
}int main(){cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cin>>a[i][j];if(a[i][j]==0)a[i][j]=2;}}dfs(0,0);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){cout<<a[i][j]<<" ";}cout<<endl;}return 0;
}

http://www.ppmy.cn/news/1325063.html

相关文章

手把手教你学会接口自动化二十一-接入断言

我们写到现在&#xff0c;还缺一个很重要的东西&#xff0c;就是断言。 对于pytest&#xff0c;常用的断言就是python原生态的assert字段进行断言 # 断言语法 assert xx &#xff1a;判断 xx 为真 assert not xx &#xff1a;判断 xx 不为真 assert a in b &#xff1a;判…

kali下-MSF-ftp_login模块破解FTP账号及密码

一、环境准备 两台设备在同一个网络内 一台kali系统&#xff1a;192.168.10.128 一台winserver2016&#xff1a;192.168.10.132 二、MSF介绍 metasploit 全称是The Metasploit Framework&#xff0c;又称MSF&#xff0c;是Kali 内置的一款渗透测试框架&#xff0c;也是全球…

Docker--harbor私有仓库

目录 一、什么是Harbor&#xff1f; 二、Harbor的特性 三、Harbor的构成 四、部署 五、维护管理Harbor 一、什么是Harbor&#xff1f; Harbor 是 VMware 公司开源的企业级 Docker Registry 项目&#xff0c;其目标是帮助用户迅速搭建一个企业级的 Docker Registry 服务。 …

MySQL深入——14

Mysql是如何保证数据不全的&#xff0c;Mysql的数据写入是两阶段提交完成的&#xff0c;即为redo log的prepare阶段和bin log阶段还有redo log的commit阶段&#xff0c;那么数据就和redo log 和bin log 有关。 我们来看看bin log 和redo log的写入机制 bin log bin log的写入…

小程序开发实战案例五 | 小程序如何嵌入H5页面

在接入小程序过程中会遇到需要将 H5 页面集成到小程序中情况&#xff0c;今天我们就来聊一聊怎么把 H5 页面塞到小程序中。 本篇文章将会从下面这几个方面来介绍&#xff1a; 小程序承载页面的前期准备小程序如何承载 H5小程序和 H5 页面如何通讯小程序和 H5 页面的相互跳转 小…

【51单片机】数码管的静态与动态显示(含消影)

数码管在现实生活里是非常常见的设备&#xff0c;例如 这些数字的显示都是数码管的应用。 目录 静态数码管&#xff1a;器件介绍&#xff1a;数码管的使用&#xff1a;译码器的使用&#xff1a;缓冲器&#xff1a; 实现原理&#xff1a;完整代码&#xff1a; 动态数码管&#…

Go 语言中高效切片拼接和 GO 1.22 提供的新方法

Table Contents 切片拼接的必要性基本拼接方法及其局限性使用 append 函数高效拼接的策略控制容量和避免副作用利用 Go 1.22 的新特性切片动态扩容的深入理解内存重新分配与数据迁移性能优化策略结论在 Go 语言中,切片拼接是一项常见的操作,但如果处理不当,可能会导致性能问…

Flink-SQL——时态表(Temporal Table)

时态表(Temporal Table) 文章目录 时态表(Temporal Table)数据库时态表的实现逻辑时态表的实现原理时态表的查询实现时态表的意义 Flink中的时态表设计初衷产品价格的例子——时态表汇率的例子——普通表 声明版本表声明版本视图声明普通表 一个完整的例子测试数据代码实现测试…