当前位置: 首页 > news >正文

搜索系列·连通块问题

小引:

连通块问题是搜索问题下的一个分支,而搜索又是基于递归的,所以连通块问题也是基于递归的一类问题。

特点:

这一类问题的函数结构大多相同,在母模版上的修改不用太多。

经典例题:

最大黑区域,岛屿数量,最大岛屿,瓷砖,细胞数量......

例题模版:

输入n,m,并输入n行m列的矩阵,类型为int(或char)。求出在矩阵中上下左右(或加上左上,左下,右上,右下)连通起来的数字(或字符)数量。

解题步骤:

壹.定义变量:

代码范例如下:

#include<bits/stdc++.h>
using namespace std;
int a[数据最大至+5][数据最大至+5];
int n,m,s;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
return 0;
}

其中,s代表连通块的数量。

贰.寻找合适的条件深搜:

代码范例如下:

#include<bits/stdc++.h>
using namespace std;
int a[数据最大至+5][数据最大至+5];
int n,m,s;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(a[i][j]==合适的条件)
{
s++;
dfs(i,j);
}
}
}
return 0;
}

例题:

问题描述

在一个 w×h 的矩形广场上,每一块 1×1 的地面都铺设了红色或黑色的瓷砖。小林同学站在某一块黑色的瓷砖上,他可以从此处出发,移动到上、下、左、右四个相邻的且是黑色的瓷砖上。现在,他想知道,通过重复上述移动所能经过的黑色瓷砖数。

输入要求:

第 1 行为 h、w(2≤w、h≤50),之间由一个空格隔开。 以下为一个 w 行 h 列的二维字符矩阵,每个字符为“.”“#”“@”,

分别表示该位置为黑色的瓷砖、红色的瓷砖、小林的初始位置。

输出要求:

输出一行一个整数,表示小林从初始位置出发经过的黑色瓷砖数。

在这道题目的实现代码中,if判断语句中填写‘@’。
然后,我们要按照递归的四要素:类型,参数,边界,内容来完成我们的代码)

参.程序代码的完成:

边界:

void dfs(int x,int y)
{
if(x<1||x>n||y<1||y>m||a[x][y]==障碍)
{
return ;
}
}

因为我们要到不越界,无障碍的地方去,所以判断条件为:不越行,不越列,不到障碍上

代码范例如下:

#include<bits/stdc++.h>
using namespace std;
int h,w,s;char a[55][55];
void dfs(int x,int y)
{
if(x<1||x>w||y<1||y>h||a[x][y]=='#')
{
return ;
}
}
int main()
{
int i,j;
cin>>h>>w;int c,d;
for( i=1;i<=w;i++)
{
for( j=1;j<=h;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=w;i++)
{
for(j=1;j<=h;j++)
{
if(a[i][j]=='@')
{

c=i;d=j;

}
}
}
dfs(c,d);
cout<<s;
return 0;
}

内容:

标记:

标记有两种方法:

1.例:a[x][y]=障碍

2.例:flag[x][y]=1

代码范例如下:

#include<bits/stdc++.h>
using namespace std;
int h,w,s;char a[55][55];
void dfs(int x,int y)
{
if(x<1||x>w||y<1||y>h||a[x][y]=='#')
{
return ;
}
s++;
a[x][y]='#';
}
int main()
{
int i,j;
cin>>h>>w;int c,d;
for( i=1;i<=w;i++)
{
for( j=1;j<=h;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=w;i++)
{
for(j=1;j<=h;j++)
{
if(a[i][j]=='@')
{

c=i;d=j;

}
}
}
dfs(c,d);
cout<<s;
return 0;
}

方向拓展:

方法1:

dfs(x-1,y);
dfs(x+1,y);
dfs(x,y-1);
dfs(x,y+1);
dfs(x-1,y-1);
dfs(x-1,y+1);
dfs(x+1,y-1);
dfs(x+1,y+1);

方法2:

int X[9]={1,-1,0,0,1,1,-1,-1},Y[9]={0,0,1,-1,1,-1,1,-1};

for(int i=1;i<8;i++)

{

dfs(x+X[i],y+Y[i]);

}

整体代码如下:

#include<bits/stdc++.h>
using namespace std;
int h,w,s;char a[55][55];
void dfs(int x,int y)
{
if(x<1||x>w||y<1||y>h||a[x][y]=='#')
{
return ;
}
s++;
a[x][y]='#';
dfs(x-1,y);
dfs(x+1,y);
dfs(x,y-1);
dfs(x,y+1);
}
int main()
{
int i,j;
cin>>h>>w;int c,d;
for( i=1;i<=w;i++)
{
for( j=1;j<=h;j++)
{
cin>>a[i][j];
}
}
for(i=1;i<=w;i++)
{
for(j=1;j<=h;j++)
{
if(a[i][j]=='@')
{

c=i;d=j;

}
}
}
dfs(c,d);
cout<<s;
return 0;
}

整体总结:

连通块问题的代码框架在各种情景、题目中差不多相同,不过在实际应用中需要灵活应变。

http://www.jsqmd.com/news/699159/

相关文章:

  • 用multiset的upper_bound/lower_bound优化你的LeetCode刷题:以‘数据流的中位数’和‘滑动窗口最大值’为例
  • rk3568 uboot图形化界面操作以及保存配置
  • CVPR 2026 Accepted?来预讲会做主角
  • 2026熙琦科技迷你手持打印设备常见选购问题解答干货分享 - 热敏感科技蜂
  • 泉州鼎盛拆除:靠谱的泉州墙体拆除哪家专业 - LYL仔仔
  • GLM-OCR API调用详解:Python示例,助你快速集成到项目
  • 常州环之宇再生资源:常州废品上门回收哪家专业 - LYL仔仔
  • Poe.com网页版深度体验:不装App,用浏览器同时“白嫖”GPT-3.5和Claude是什么体验?
  • ICode Python 2级闯关:从循环嵌套到多角色协同的综合编程思维训练
  • 力扣hot100(9-找到字符串中所有字母异位词;10-和为K的子数组)
  • Cursor Pro免费激活工具:跨平台设备标识重置技术方案
  • 2026年湖南长沙短视频运营与GEO豆包AI搜索推广深度横评|企业获客新赛道完全指南 - 年度推荐企业名录
  • 别再为音频格式发愁了!一个Java工具类搞定WAV转MP3、AMR转码(附完整代码和依赖配置)
  • 宪意(山东)建筑拆除:济南拆门窗服务商 - LYL仔仔
  • BarrageGrab:全平台直播弹幕抓取架构设计与企业级应用解决方案
  • 实测分享:3家在线平面设计公司对比,2026传媒/广告店线上设计辅助首选
  • open-xiaoai-bridge:让小爱同学语音控制任意智能设备
  • 南京乐意工程机械租赁:口碑好的南京叉车出租服务 - LYL仔仔
  • F5 NGINX Agent部署与运维实战:实现NGINX配置管理与监控自动化
  • 3分钟快速掌握AI视频水印移除技术:从技术原理到实战应用
  • 从头构建可审计合约项目:C++26 contracts + CMake + sanitizers + CI流水线(GitHub Actions一键部署版)
  • 为什么你的C++26合约始终不生效?深度解析__cpp_contracts宏、-fcontracts和-fcontract-continuation三者协同逻辑
  • 智能体工作流编排:基于图计算模型的复杂AI应用开发框架解析
  • Nuxt 2文档网站重构指南:如何用Docus打造高性能技术文档平台
  • 哈尔滨市道里区胜广建材:哈尔滨沙子出售优秀公司 - LYL仔仔
  • 从vue-print-nb到原生JS:我的前端打印功能选型踩坑实录与避坑指南
  • 西安市长安区鑫宝通建筑:西安钢管架搭建翻新公司 - LYL仔仔
  • 工业电源模块选型参考:钡特电源 DB1-05S03S 与 B0503S-1WR3 封装兼容解析
  • CGI脚本
  • OCS Inventory NG Windows Agent:自动化资产盘点的核心原理与实战部署指南