广度优先算法BFS
package myalgorithm; import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
/*BFS用于记录的位置和值的结构*/
class node
{
node(int xparam,int yparam,int valparam)
{
this.x = xparam;
this.y = yparam;
this.value = valparam;
}
int x,y,value;
}
public class ShortPath {
/*全局最短路径*/
public int stepnum = 999;
/*构建11*11的迷宫,英雄H在(1,1)的位置出发,去解救美女M(6,8)*/
char[][] graph = {
{'#','#','#','#','#','#','#','#','#','#','#'},
{'#','H','_','_','*','_','_','*','_','_','#'},
{'#','_','_','_','_','_','_','_','_','_','#'},
{'#','_','*','_','_','_','*','_','_','_','#'},
{'#','_','_','_','*','_','_','_','_','*','#'},
{'#','_','_','_','_','_','_','*','_','*','#'},
{'#','_','*','_','_','_','_','_','M','_','#'},
{'#','*','_','_','*','_','_','_','_','_','#'},
{'#','_','_','_','_','_','_','_','_','_','#'},
{'#','_','_','_','*','_','_','_','_','_','#'},
{'#','#','#','#','#','#','#','#','#','#','#'},
};
/*初始标记数组都为0*/
public int[][] mark = new int[graph.length][graph.length];
/*每一个位置有四种选择:右下左上*/
public int[][] choose = {
{0,1},
{1,0},
{0,-1},
{-1,0}
};
/*BFS算法*/
public void BFS(node startPoint)
{
//起始点装入队列
Queue<node> queue = new LinkedList<node>();
startPoint.value = 1;//确保起始步数为1
queue.offer(startPoint); node t1;
int tx,ty;
top:
while(!queue.isEmpty())
{
//取队首,出队后不再入队,value也自此固定
t1 = queue.poll();
mark[t1.x][t1.y] = t1.value;//标记步数
for(int i=0;i<4;i++)
{
tx = t1.x + choose[i][0];
ty = t1.y + choose[i][1]; //找到美女,肯定是最短的,可以立即返回
if(graph[tx][ty] == 'M')
{
stepnum = t1.value + 1;//下一步可到
mark[tx][ty] = stepnum;
break top;
}
//继续接着找,把空路径添加到队列末尾
//不是炸弹和围墙,并且没有被标记
if(graph[tx][ty] != '#'
&& graph[tx][ty] != '*'
&&mark[tx][ty] == 0)
{
queue.offer(new node(tx,ty,t1.value+1));
}
}
}
}
/*BFS回溯路径*/
private void getPath(node target) { int beforex = 0,beforey = 0;
int x = target.x;
int y = target.y;
for(int i=0;i<4;i++)
{
beforex = x + choose[i][0];
beforey = y + choose[i][1];
//找到英雄的出发点,函数结束
if (beforex == 1 && beforey == 1)
{
return;
}
if(mark[x][y] - 1 == mark[beforex][beforey])
{
System.out.print("("+beforex+","+beforey+")<--");
break;
}
}
getPath(new node(beforex,beforey,0));
return;
}
/*main函数*/
public static void main(String[] args) {
ShortPath my = new ShortPath(); long start = System.currentTimeMillis();
my.BFS(new node(1,1,0));
long end = System.currentTimeMillis();
System.out.println("BFS step: " + my.stepnum + " time:" + (end-start));
//打印标记结果
for (int m = 0;m<my.graph.length;m++)
System.out.println(Arrays.toString(my.mark[m]));
//打印巡回路径
my.getPath(new node(6,8,0));
} }
BFS step: 13 time:4
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 2, 3, 0, 7, 8, 0, 10, 11, 0]
[0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0]
[0, 3, 0, 5, 6, 7, 0, 9, 10, 11, 0]
[0, 4, 5, 6, 0, 8, 9, 10, 11, 0, 0]
[0, 5, 6, 7, 8, 9, 10, 0, 12, 0, 0]
[0, 6, 0, 8, 9, 10, 11, 0, 13, 0, 0]
[0, 0, 10, 9, 0, 11, 0, 0, 0, 0, 0]
[0, 0, 11, 10, 11, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
(5,8)<--(4,8)<--(4,7)<--(4,6)<--(4,5)<--(3,5)<--(3,4)<--(3,3)<--(2,3)<--(2,2)<--(2,1)
扩展:
PhotoShop中的魔术棒选择工具的原理,就是从鼠标选中的点作为种子,并加入队列;依次查找周边的点,如果颜色与种子颜色相近,则加入队列;对队列中的元素依次进行类似扩展,这样就选取了与最初种子颜色相同的点的集合。
广度优先算法BFS的更多相关文章
- 广度优先算法(BFS)与深度优先算法(DFS)
一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...
- 图的遍历(搜索)算法(深度优先算法DFS和广度优先算法BFS)
图的遍历的定义: 从图的某个顶点出发访问遍图中所有顶点,且每个顶点仅被访问一次.(连通图与非连通图) 深度优先遍历(DFS): 1.访问指定的起始顶点: 2.若当前访问的顶点的邻接顶点有未被访问的,则 ...
- [ACM训练] 算法初级 之 搜索算法 之 广度优先算法BFS (POJ 3278+1426+3126+3087+3414)
BFS算法与树的层次遍历很像,具有明显的层次性,一般都是使用队列来实现的!!! 常用步骤: 1.设置访问标记int visited[N],要覆盖所有的可能访问数据个数,这里设置成int而不是bool, ...
- 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
深度优先(DFS) 深度优先遍历,从初始访问结点出发,我们知道初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接 ...
- 【数据结构与算法Python版学习笔记】图——词梯问题 广度优先搜索 BFS
词梯Word Ladder问题 要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE: FOOL >> POOL >> POLL >> POLE > ...
- 广度优先遍历-BFS、深度优先遍历-DFS
广度优先遍历-BFS 广度优先遍历类似与二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问的顶点w1 w2 w3....wn,然后再依次访问w1 w2 w3 ...
- 聊聊算法——BFS和DFS
如果面试字节跳动和腾讯,上来就是先撕算法,阿里就是会突然给你电话,而且不太在意是周末还是深夜, 别问我怎么知道的,想确认的可以亲自去试试.说到算法,直接力扣hard三百题也是可以的,但似乎会比较伤脑, ...
- 广度优先搜索 BFS 学习笔记
广度优先搜索 BFS 学习笔记 引入 广搜是图论中的基础算法之一,属于一种盲目搜寻方法. 广搜需要使用队列来实现,分以下几步: 将起点插入队尾: 取队首 \(u\),如果 $u\to v $ 有一条路 ...
- C语言之广度优先算法
广度优先算法又称宽度优先搜索,是一种简便的图的搜索算法之一.搜索方式大致是这样的: 直到搜索到目标结点(结点就是那些圆球球,其中有一个或者多个是目标结点)或者搜完了整个图都没找到目标结点就停止搜索. ...
随机推荐
- BI之ETL学习(一)kettle
最近开始折腾数据,起源是多业务数据源需要转换到数据分析平台.这个过程需要跨机器,跨库.同时还需要将业务数据表的内容进行转换,合并,清洗等等操作. 经过多方选型,最终决定使用kettle来作为数据抽取处 ...
- Word2010编号列表&多级列表
1.引用场景 对于一份标准.漂亮的word文档,编号列表和多级列表的设置时必不可少的,正因为有它们,文档看起来才更专业,使用起来才更加的方便.如下面截图一般,这是十分常见的多级列表设置 ...
- NopCommerce Html扩展方法Html.Widget
在Nop中有一个Html扩展的类叫HtmlExtensions,主要源码: public static class HtmlExtensions { #region Admin area extens ...
- 苹果开发工具:Xcode和Interface Builder
摘要:在Mac OS X上开发,首选Xcode继承开发环境.本文对开发工具套件中最重要的Xcode和Interface Builder两个工具做了简要介绍,并提供<苹果开发工具概述>PDF ...
- debian7安装oracle11g
1,安装必须包 apt-get install gcc g++ make binutils libc6 libc6-dev libstdc++6 libstdc++5 rpm gawk alien ...
- SSIS 学习(2):数据流任务(上)【转】
数据流任务是SSIS中的一个核心任务,估计大多数ETL包中,都离不开数据流任务.所以我们也从数据流任务学起. 数据流任务包括三种不同类型的数据流组件:源.转换.目标.其中: 源:它是指一组数据存储体, ...
- Write a beautiful button
.btn-warning { color: #fff; text-shadow: 0 -1px 0 rgba(0,0,0,0.25); background-color: #faa732; backg ...
- [改善Java代码]Java的泛型是类型擦除的
泛型可以减少强制类型的转换,可规范集合的元素类型,还可以提高代码的安全性和可读性,正是因为有了这些优点,自从Java引入泛型之后,项目的编码规则上便多了一条,优先使用泛型. Java泛型(Generi ...
- nmap命令-----高级用法
探测主机存活常用方式 (1)-sP :进行ping扫描 打印出对ping扫描做出响应的主机,不做进一步测试(如端口扫描或者操作系统探测): 下面去扫描10.0.3.0/24这个网段的的主机 nmap ...
- 利用ExpandableListView和gridview 显示可展开折叠菜单导航
这篇随身笔带来的是结合聚合数据“菜谱大全”做的一个菜谱可折叠一级+二级列表. 先发来一些截图一睹为快吧. ExpandableListView 可用于折叠型菜单列表,其布局主要通过getGroupVi ...