简谈BFS
BFS的最好理解就是“层次遍历”,他是一层层往下走的。时间复杂度同DFS。
重点在于使用队列来缓存要遍历的结点。
给出核心代码(c++):使用STL中的queue,vex[v][vi] is adjacent matrix
queue<int> que;
que.push(v0); //v0是起始点
while(!que.empty()){
int v = que.front(); //取队头
que.pop(); //出队
for(int vi=;vi<n;vi++){
if(vex[v][vi]){
que.push(vi); //vi入队
}
}
}
BFS可以推广到三维数组,用于计算由像素块组成的三维不规则物体体积、三维物体的连通情况。之前在PAT题目中遇到过一次,在此特别记录一下这样题目的处理方法。
这种题目是二维BFS走迷宫过程的一种扩展。先说一下三维数组的表示以及初始化:
pixel vex[][][];
for(int z=;z<l;z++){
for(int x=;x<n;x++){
for(int y=;y<m;y++){
vex[z][x][y].x = x;
vex[z][x][y].y = y;
vex[z][x][y].z = z;
vex[z][x][y].state = ;
}
}
}
假设v[z][x][y]=1说明这点被像素所填充,这样上面的代码就构造了n*m*l完全被填充的立方体。
再来假设搜索位上下左右前后,那么BFS的方向数组又该如何设计?
int x[] = {,,-,,,};
int y[] = {,,,-,,};
int z[] = {,,,,,-};
那么接下来BFS的核心很好处理了
检验函数,可以很好的避免堆栈溢出~~
bool check(int z,int x,int y){
return tz>= && tz<l && tx>= && tx<n && ty>= && ty<m;
}
que<pixel> vex;
while(!que.empty()){
pixel v = que.front();
que.pop();
for(int i=;i<;i++){
int tz = v.z+z[i]; //求下个点
int tx = v.x+x[i];
int ty = v.y+y[i];
check(tz,tx,ty) continue;
if( vex[tz][tx][ty] ){ //可以到达
que.push(vex[tz][tx][ty]);
}
}
}
以上就是三维物体体积的BFS求解方式。之后再说一个个人观点,二维平面求不规则面积的问题似乎也可以用这种方式解决。
BFS在做层次遍历的时候我们要怎样记录各点所属的层呢?
while(!que.empty()){
vi = que.front();
if(layer[vi] > maxlayer){
maxlayer = layer[vi]; //BFS tree的深度
index = ; //初始化为极大
}
if(vi != v0){
index = min(index,vi); //最深那层中的编号最小的点
}
for(int i=;i<=n;i++){
if(!visit[i] && v[vi][i] != ){
visit[i] = true;
layer[i] = layer[vi]+; //进入了下一层,记录下i点所在的层数
que.push(i);
}
}
que.pop();
}
以上代码是PAT中“喊山”一题的核心代码,很好的诠释了了BFS过程中层次的维护方法。
将来遇到了新问题还会作补充。。。
简谈BFS的更多相关文章
- .NET简谈接口
自从面向对象开发方式的出现,抽象的概念就开始日新月异的发展,面向对象编程.面向接口编程.面向组件编程等等:这一系列的概念都是软件工程所追求的思想范畴,高类聚低耦合. 今天我要简谈的是面向对象里面非常重 ...
- .NET简谈构件系统开发模式
转自[王清培] http://www.cnblogs.com/wangiqngpei557/archive/2011/06/14/2080416.html 在本人的“.NET简谈插件系统开发模式”一文 ...
- .NET简谈——跨进高级编程门槛的必经之路
我们继续C#基础知识的学习,这篇文章对前面基础知识学习的朋友有着举足轻重的作用:为了延续基础知识学习的热情,我编写了这篇特殊的文章. 本篇文章的中心是想借“.NET简谈反射(动态调用)”一文继续发挥下 ...
- 简谈Java语言的继承
Java语言的继承 这里简谈Java语言的三大特性之二——继承. Java语言的三大特性是循序渐进的.是有顺序性的,应该按照封装-->继承-->多态这样的顺序依次学习 继承的定义 百度百科 ...
- 简谈Java语言的封装
简谈Java语言的封装 封装的定义 封装将复杂模块或系统的逻辑实现细节隐藏,让使用者只需要关心这个模块或系统怎么使用,而不用关心这个模块或系统是怎么实现的. 在面向对象的的编程中,我们一般通过接口来描 ...
- MPI简谈
MPI简谈 MPI是分布式内存系统,区别于OpenMP和Pthreads的共享内存系统.MPI是一种基于消息传递的并行编程技术,是如今最为广泛的并行程序开发方法. MPI前世今生 MPI(Messag ...
- ASP.NET MVC 网站开发总结(六)——简谈Json的序列化与反序列化
首先,先简单的谈一下什么是序列化与反序列化,序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当前状态写入到临时或持久性存储区.以后,可以通 ...
- 简谈HTML5与APP技术应用
HTML5到底能给企业带来些什么? HTML5是近年来互联网行业的热门词汇,火的很.微软IE产品总经理发文: 未来的网络属于HTML5.乔布斯生前也在公开信<Flash之我见>中预言:像H ...
- 简谈WP,IOS,Android智能手机OS
什么是智能手机? 相信到现在这个已经是傻瓜到不能再傻瓜的问题了 智能手机都不懂? 那你活着还有什么意思= = 但是为了谈论今天的三大主角:wp,ios,android 不得不回答一下这个笨笨的问题 如 ...
随机推荐
- Redis 6.0 新特性 ACL 介绍
Redis 6.0 新特性 ACL 介绍 Intro 在 Redis 6.0 中引入了 ACL(Access Control List) 的支持,在此前的版本中 Redis 中是没有用户的概念的,其实 ...
- 抛出这8个问题,检验一下你到底会不会ThreadLocal,来摸个底~
0.问题 和Synchronized的区别 存储在jvm的哪个区域 真的只是当前线程可见吗 会导致内存泄漏么 为什么用Entry数组而不是Entry对象 你学习的开源框架哪些用到了ThreadLoca ...
- centos 安装 nginx 及配置 的坑
centos 安装 nginx 教程 1.创建/etc/yum.repos.d/nginx. centos 安装 nginx 教程 1.创建/etc/yum.repos.d/nginx.repo to ...
- 黎曼函数ζ(2n)的几种求法
\(\zeta (2n)\)的几种求法 目录 $\zeta (2n)$的几种求法 结论 欧拉的证明 进一步探索,$\zeta$ 函数.余切.伯努利数的关系 傅立叶分析证明 留数法证明 参考资料 结论 ...
- scp的使用以及cp的对比
scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速度.当你服务器 ...
- Spring Data JPA根据属性名查询
https://blog.csdn.net/chengqiuming/article/details/82528961
- Python os.chown() 方法
概述 os.chown() 方法用于更改文件所有者,如果不修改可以设置为 -1, 你需要超级用户权限来执行权限修改操作.高佣联盟 www.cgewang.com 只支持在 Unix 下使用. 语法 c ...
- PHP strcoll() 函数
实例 比较字符串: <?php高佣联盟 www.cgewang.comsetlocale (LC_COLLATE, 'NL');echo strcoll("Hello World!&q ...
- C/C++编程笔记:C语言实现连连看游戏,小白练手项目(源码分享)
本篇文章分享看题目就知道是写给初学者的,学的比较好的小伙伴也可以将自动算法等一些知识给加进去,希望对大家有帮助! 好了,当我们所有的准备工作做好之后,我们就可以来编写我们的C语言连连看游戏了! 其实这 ...
- Python创建一个爬虫项目===从零开始哟!想说的下次 要不要出一期关于pycharm与Python之间的合作
当然,不用爬虫框架,也是可以的 比如说 beauitfulsoup xml http 就可以完美的得到一个爬虫的解决方案! 个人的意思是,新手或者刚入门的可以考虑以上的方式进行练习后 在使用框架 首先 ...