【BFS染色问题】P1162填涂颜色例题+核心逻辑

server/2025/3/30 18:26:49/

文章目录

        • 算法思路】
        • 【代码示例】
      • BFS处理染色问题的核心逻辑

在这里插入图片描述

算法思路】

要判断一个数字 0 是否在闭合圈内,可以换个角度思考。不在闭合圈内的 0 是可以从方阵的边界出发,通过上下左右移动,只经过其他 0 到达的。

  • 思路①.我们可以从方阵的四条边界上的 0 开始进行广度优先搜索(BFS),将这些能从边界到达的 0 标记出来,那么剩下的未被标记的 0 就是在闭合圈内的。
  • 思路②.可以先默认所有0为2,再从所有地图边缘的2进行腐蚀,未被腐蚀的就是被1保护的2
【代码示例】
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
typedef pair<int,int> PII;const int N=40;
int n;
int g[N][N];//地图矩阵 
bool st[N][N];//标记是否被访问过 
int dx[]={-1,0,1,0},dy[]={0,-1,0,1};void bfs(){queue<PII> q;//遍历队列//将四条边上的0加入队列,作为队列起点 for(int i=0;i<n;i++){if(g[0][i] == 0){q.push({0,i});//第一行st[0][i]=true;}if(g[n-1][i] == 0){q.push({n-1,i});//最后一行st[n-1][i]=true;}if(g[i][0] == 0){q.push({i,0});//第一列 st[i][0]=true;}if(g[i][n-1] == 0){q.push({i,n-1});//最后一列 st[i][n-1]=true;}} while(!q.empty()){auto t=q.front();//将队头出队 q.pop();for(int i=0;i<4;i++){int x=t.first+dx[i],y=t.second+dy[i];if(x<0 || x>=n || y<0 || y>=n) continue;//越界情况if(g[x][y]==0 && !st[x][y]){//将不在闭合圈的0入队并标记q.push({x,y});st[x][y]=true;}}}
}int main(){cin>>n;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cin>>g[i][j];}}bfs();//将未被标记的0改为2for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(g[i][j]==0 && !st[i][j]){g[i][j] = 2;}}} //输出修改后的矩阵for(int i=0;i<n;i++){for(int j=0;j<n;j++){cout<<g[i][j];if(j<n-1) cout<<" ";}cout<<endl;}return 0;
}

BFS处理染色问题的核心逻辑

  1. 确定起点:选择与问题条件相关的起点(如本题的边界 0)。
  2. 层序遍历:使用队列逐层扩展,确保所有可达节点被访问。
  3. 标记节点:通过标记数组记录节点是否被访问,避免重复处理。
  4. 结果处理:根据标记数组修改目标区域(如将未标记的 0 填为 2)。

http://www.ppmy.cn/server/179535.html

相关文章

用Deepseek写扫雷uniapp小游戏

扫雷作为Windows系统自带的经典小游戏&#xff0c;承载了许多人的童年回忆。本文将详细介绍如何使用Uniapp框架从零开始实现一个完整的扫雷游戏&#xff0c;包含核心算法、交互设计和状态管理。无论你是Uniapp初学者还是有一定经验的开发者&#xff0c;都能从本文中获得启发。 …

[思路提供]Mysql主从复制时的网络延迟很高,如何调整MySQL复制参数

在 MySQL 主从复制过程中&#xff0c;如果网络延迟很高&#xff0c;可以通过调整以下复制参数来优化数据同步&#xff1a; 增加复制并行度&#xff1a; slave_parallel_workers&#xff1a;从 MySQL 5.6 开始支持多线程复制&#xff0c;可将该值设置为大于 0 的值&#xff0c;根…

练习题:105

目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 导入 random 模块&#xff1a; 定义列表&#xff1a; 随机选择元素&#xff1a; 打印结果&#xff1a; 运行思路 结束语 Python题目 题目 从一个列表中随机选择一个元素。 …

气象可视化卫星云图的方式:方法与架构详解

气象卫星云图是气象预报和气候研究的重要数据来源。通过可视化技术,我们可以将卫星云图数据转化为直观的图像或动画,帮助用户更好地理解气象变化。本文将详细介绍卫星云图可视化的方法、架构和代码实现。 一、卫星云图可视化方法 1. 数据获取与预处理 卫星云图数据通常来源…

SQL 通用表表达式(CTE )

目录 概念&#xff1a;CTE&#xff1a; Common table Expression CTE 语法 CTE Demo 概念&#xff1a;CTE&#xff1a; Common table Expression 通用表表达式&#xff08;CTE&#xff09;是SQL中用于简化复杂查询的工具&#xff0c;第一次上线于SQL Server 2005。 CTE提供…

用C#实现UDP服务器

对UDP服务器的要求 如同TCP通信一样让UDP服务端可以服务多个客户端 需要具备的条件&#xff1a; 1.区分消息类型(不需要处理分包、黏包) 2.能够接收多个客户端的消息 3.能够主动给自己发过消息的客户端发消息(记录客户端信息)…

Vue学习笔记集--postcss-px-to-viewport

postcss-px-to-viewport插件 以下是 postcss-px-to-viewport 插件的功能和使用方法&#xff1a; 功能 postcss-px-to-viewport 是一个 PostCSS 插件&#xff0c;用于将 CSS 中的 px 单位转换为 vw 或 vh 单位。它可以帮助实现不同屏幕尺寸下的自适应布局&#xff0c;提高页面…

100天精通Python(爬虫篇)——第122天:基于selenium接管已启动的浏览器(反反爬策略)

文章目录 1、问题描述2、问题推测3、解决方法3.1 selenium自动启动浏览器3.2 selenium接管已启动的浏览器3.3 区别总结4、代码实战4.1 手动方法(手动打开浏览器输入账号密码)4.2 自动方法(.bat文件启动的浏览器)1、问题描述 使用selenium自动化测试爬取pdd的时候,通过携带…