广度优先搜索BFS

文章目录

  • 广度优先搜索BFS
    • HDU-1253 胜利大逃亡
    • HDU-1241 Oil Deposits

算法思想

  1. 从初始状态S开始,利用一定的规则,生成所有下一层的状态,依次入队
  2. 依次出队,顺序检查所有状态,看是否出现目标状态G,如果没出现,就对它们分别利用规则,生成再下一层的所有状态
  3. 找到目标G

算法框架

queue<type> q;
q.push({初始状态}); // 初始状态入队
isVis[初始状态]=1; // 标记初始状态为已访问
while(!q.empty()){type p=q.front(); // 取队首q.pop(); // 当前队首直接出队if(p==目标状态){...;break;}所有与p相邻且未访问的结点入队,并标记它们为已访问;
}

在搜索过程中,bfs对于节点是沿着深度一层一层扩展的,也就是说要扩展到第 n + 1 n+1 n+1层时,第n层已经被访问完了。

同一层对于问题的求解有着相同的价值。

适用于找最短路径

HDU-1253 胜利大逃亡

可提交中文题目:胜利大逃亡

描述

Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会.

魔王住在一个城堡里,城堡是一个 A × B × C A\times B \times C A×B×C的立方体,可以被表示成A个 B × C B\times C B×C的矩阵,刚开始Ignatius被关在 ( 0 , 0 , 0 ) (0,0,0) (0,0,0)的位置,离开城堡的门在 ( A − 1 , B − 1 , C − 1 ) (A-1,B-1,C-1) (A−1,B−1,C−1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出口就算离开城堡,如果走到出口的时候魔王刚好回来也算逃亡成功),如果可以请输出需要多少分钟才能离开,如果不能则输出-1.

Input

输入数据的第一行是一个正整数K,表明测试数据的数量.每组测试数据的第一行是四个正整数A,B,C和T(1<=A,B,C<=50,1<=T<=1000),它们分别代表城堡的大小和魔王回来的时间.然后是A块输入数据(先是第0块,然后是第1块,第2块…),每块输入数据有B行,每行有C个正整数,代表迷宫的布局,其中0代表路,1代表墙.(如果对输入描述不清楚,可以参考Sample Input中的迷宫描述,它表示的就是上图中的迷宫)

特别注意:本题的测试数据非常大,请使用scanf输入,我不能保证使用cin能不超时.在本OJ上请使用Visual C++提交.

Output

对于每组测试数据,如果Ignatius能够在魔王回来前离开城堡,那么请输出他最少需要多少分钟,否则输出-1.

Sample Input

1
3 3 4 20
0 1 1 1
0 0 1 1
0 1 1 1
1 1 1 1
1 0 0 1
0 1 1 1
0 0 0 0
0 1 1 0
0 1 1 0

Sample Output

11

参考题解

#include <iostream>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
int k,a,b,c,t,st; // st用于记录当前步长const int dx[]={0, 0, 1, 0, 0, -1}; // 三维方向数组
const int dy[]={0, 1, 0, 0, -1, 0};
const int dz[]={1, 0, 0, -1, 0, 0};struct point{int x,y,z;int step;
};
queue<point> q;
bool isVis[55][55][55];
void clearQ(){while (!q.empty())q.pop();
}
int map[55][55][55];
bool isFind=0;bool isAvailale(point p){if(p.x<0||p.y<0||p.z<0)return false;if(p.x>a-1||p.y>b-1||p.z>c-1)return false;if (isVis[p.x][p.y][p.z])return false;if(map[p.x][p.y][p.z])return false;return true;
}void bfs(){q.push({0,0,0,0});isVis[0][0][0]=1;while (!q.empty()){point cur=q.front();if (cur.step>t)return; // 剪枝q.pop();if(cur.x==a-1&&cur.y==b-1&&cur.z==c-1){isFind=1;st=cur.step;return;}for(int i=0;i<6;i++) {point next;next.x = cur.x + dx[i];next.y = cur.y + dy[i];next.z = cur.z + dz[i];next.step = cur.step + 1;if (isAvailale(next)){isVis[next.x][next.y][next.z]= true;q.push(next);}}}
}int main(){scanf("%d",&k);while (k--){clearQ();memset(isVis,0,sizeof(isVis));memset(map,0, sizeof(map));isFind=0;scanf("%d%d%d%d",&a,&b,&c,&t);for(int i=0;i<a;i++)for(int j=0;j<b;j++)for(int p=0;p<c;p++)scanf("%d",&map[i][j][p]);bfs();if(isFind&&st<=t)printf("%d\n",st);else printf("-1\n");}return 0;
}

HDU-1241 Oil Deposits

中文版可提交题目:石油探测

GeoSurvComp地质调查公司负责探测地下石油储藏。 GeoSurvComp现在在一块矩形区域探测石油,并把这个大区域分成了很多小块。他们通过专业设备,来分析每个小块中是否蕴藏石油。如果这些蕴藏石油的小方格相邻,那么他们被认为是同一油藏的一部分。在这块矩形区域,可能有很多油藏。你的任务是确定有多少不同的油藏。

Input

输入可能有多个矩形区域(即可能有多组测试)。每个矩形区域的起始行包含m和n,表示行和列的数量,1<=n,m<=100,如果m =0表示输入的结束,接下来是m行,每行n个字符。每个字符对应一个小方格,并且要么是’*’,代表没有油,要么是’@’,表示有油。

Output

对于每一个矩形区域,输出油藏的数量。两个小方格是相邻的,当且仅当他们水平或者垂直或者对角线相邻(即8个方向)。

Sample Input

1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0 

Sample Output

0
1
2
2

参考题解

#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
int T;
int n,m,num; // m-line
char map[130][130];
bool isVis[130][130];
struct point{int x,y;
};
int dx[]={0,1,1,1,0,-1,-1,-1};
int dy[]={1,1,0,-1,-1,-1,0,1};
queue<point> q;
void clearQ(){while (!q.empty())q.pop();
}int main(){while (cin>>m>>n&&m&&n){memset(isVis,0,sizeof(isVis));num=0;for(int i=0;i<m;i++)cin>>map[i];for(int i=0;i<m;i++)for(int j=0;j<n;j++){if(map[i][j]=='@'&&!isVis[i][j]){num++;isVis[i][j]= true;q.push({i,j});while (!q.empty()){point cur=q.front();q.pop();for(int k=0;k<8;k++){int nx=cur.x+dx[k];int ny=cur.y+dy[k];if(nx<0||ny<0||nx>m-1||ny>n-1)continue;if(isVis[nx][ny])continue;if(map[nx][ny]=='@')q.push({nx,ny}),isVis[nx][ny]=1;}}}}cout<<num<<endl;}return 0;
}

算法复习|广度优先搜索BFS相关推荐

  1. 算法简介:层层递进----广度优先搜索(BFS)

    算法简介:层层递进----广度优先搜索(BFS) 算法简介 算法简介 BFS算法思想: 首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的顶点,再访问它们相邻的未被访问过的 ...

  2. 【算法】广度优先搜索(BFS)和深度优先搜索(DFS)

    https://blog.csdn.net/raphealguo/article/details/7523411 https://blog.csdn.net/qq_41681241/article/d ...

  3. 一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

  4. 算法导论--广度优先搜索和深度优先搜索

    广度优先搜索 在给定图G=(V,E)和一个特定的源顶点s的情况下,广度优先搜索系统地探索G中的边,以期"发现"可从s 到达的所有顶点,并计算s 到所有这些可达顶点之间的距离(即最少 ...

  5. 广度优先搜索(BFS)——抓住那头牛(POJ 4001)

    本文将以(POJ 4001)抓住那头牛 为例,讲解经典算法广度优先搜索(BFS)的STL写法 在实际写算法中,怎么能不使用更快.更方便.更准确.更高效的C++ STL模板呢 相信很多人都了解过广度优先 ...

  6. 常用算法2 - 广度优先搜索 深度优先搜索 (python实现)

    1. 图 定义:图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合. 简单点的说:图由节点和边组成.一 ...

  7. 广度优先搜索BFS进阶(一):多源BFS、优先队列BFS、双端队列BFS

    一.多源BFS 在上一篇博客:广度优先搜索BFS基础中,我们接触到的BFS均是单起点(单源)的,但是对于某一些问题,其有多个起点,此类问题我们称为多源BFS问题.先思考下面一道例题: 1.腐烂的橘子 ...

  8. 【蓝桥杯】历届试题 青蛙跳杯子(广度优先搜索bfs)(C++)

    [蓝桥杯]历届试题 青蛙跳杯子 问题描述 思路分析 代码实现 问题描述 题目链接:青蛙跳杯子 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 X星球的流行宠物是青蛙,一般有两种颜色: ...

  9. 广度优先搜索 BFS算法

    广度优先搜索算法(Breadth-First-Search,BFS),又称作宽度优先搜索.BFS算法是从根节点开始,沿着树的宽度遍历树的节点.如果所有节点均被访问,则算法中止. 算法思想 1.首先将根 ...

最新文章

  1. python windows epoll_Windows 10生产力提升之WSL实践
  2. linux 检查 文件末尾 是否有空行
  3. python怎么安装包-怎么在windows下安装python第三方包
  4. matlab 线性拟合相关系数,Matlab自动选择相关性最高波段并拟合曲线
  5. Spark分布式集群的搭建和运行
  6. java 倒计时门栓,同步器
  7. 计算机网络学习笔记(26. Web缓存技术)
  8. c语言基础编程题山东科技大学,C语言练习题〔山东科技大学吐血整理〕.doc
  9. php对用户输入的非标准格式日期匹配
  10. 电脑上老出现万象预览的广告_电脑必备6款黑科技软件,让你的电脑更好用,千万别错过...
  11. 【机器学习+NER】手把手教你用机器学习CRF模型构建NER系统(CCL2021)
  12. Centos8 更换DNF源
  13. 云上生活——数字经济万物互联
  14. 《 ERP高级计划》书的解读之二APS算法分析之单一:内点方法(蔡颖)(转)
  15. LinkTrack UWB定位系统NLink协议解析方法
  16. Hadoop配置—完全分布式
  17. mysql默认编码改为gkb编码_MYSQL数据库默认latin1字符集转换为GBK或UTF8
  18. JSON是什么?JSON字符串是什么?JSON对象又是什么?
  19. 2022年下半年信息系统项目管理师上午真题及答案解析
  20. 机器学习PR:神经网络系列之概述

热门文章

  1. SLAM硬件搭建(激光雷达+IMU+相机+移动底盘)
  2. ORACLE数据库应用开发三十忌
  3. imageJ两张图像融合 我怎么叠加三通道 imageJ叠加
  4. 在caffe中添加新层 L1 Loss layer
  5. My97DatePicker日期控件,强大的日期控件,想怎么控制时间就怎么控制
  6. 计算机ps计划,ps工作室计划书.doc
  7. C#\WPF高仿QQ音乐V12.8界面篇《2》
  8. 路由器(第二十五课)
  9. linux下svn服务器搭建及使用
  10. 抽象类和接口的特点和异同