广度优先搜索法

1.广度优先搜索法:就是通过指定一个节点,向四周节点搜索,搜索到的新节点判断是否出界,再次判断是否已经被访问,如未被标记也未出界,就将对应数组中的数字就输出,(ps:自我简单的了解)

从队列头取出一个结点,检查它按照扩展规则是否能够扩展,如果能则产生一个新结点。 
(2)检查新生成的结点,看它是否已在队列中存在,如果新结点已经在队列中出现过,就放弃这个结点,然后回到第(1)步。否则,如果新结点未曾在队列中出现过,则将它加入到队列尾。 
(3)检查新结点是否目标结点。如果新结点是目标结点,则搜索成功,程序结束;若新结点不是目标结点,则回到第(1)步,再从队列头取出结点进行扩展......。 
最终可能产生两种结果:找到目标结点,或扩展完所有结点而没有找到目标结点。 
如果目标结点存在于解答树的有限层上,广度优先搜索算法一定能保证找到一条通向它的最佳路径,因此广度优先搜索算法特别适用于只需求出最优解的问题。当问题需要给出解的路径,则要保存每个结点的来源,也就是它是从哪一个节点扩展来的。

package com.qdcz.breadth.demo;

import java.util.LinkedList;
import java.util.Queue;

/**
*
* <p>Title: BreadthA</p>
* <p>Description:广度优先搜索算法 </p>
* <p>Company:奇点创智 </p>
* <p>Version: 1.0</p>
* @author Administrator
* @date 2017年6月5日 下午8:40:34
*/
public class BreadthA {
private int r=4;
private int c=4;
private int[][] graph={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
private int[][]gr=new int[r][c];//标记。被访问标记为1,非1便没被标记
int[][] rc={{0,1},{0,-1},{1,0},{-1,0}};//四个方向
public static void main(String[] args) {
new BreadthA().bFs();
}
class Node{
int r;//行
int c;//列
int k;//第几波被访问的
public Node(int r, int c, int k) {
super();
this.r = r;
this.c = c;
this.k = k;
}
}

public void bFs(){
Node done=new Node(0, 0, 0);//初始化。从0,0开始
gr[0][0]=1;//0,0默认被访问
Queue<Node> qu=new LinkedList<>();
qu.offer(done);//将初始化的node传入队列
while(!qu.isEmpty()){
Node node = qu.poll();//获取并移除队列头
for (int i = 0; i <4; i++) {//循环四次,分别是四个方向
//形成新的行列
int newr=node.r+rc[i][0];
int newc=node.c+rc[i][1];
//如果新的行和列超出范围就跳过这次循环
if(newr<0||newc<0||newr>=r||newc>=c) continue;
//如果新的节点已被访问也跳过此次循环
if(gr[newr][newc]!=0)continue;
//标记当前的节点已被访问
gr[newr][newc]=1;
//加入队列
qu.offer(new Node(newr, newc, node.k+1));
System.out.println(graph[newr][newc]+" "+(node.k+1));
}
}
}
}

时间: 2024-10-12 10:47:54

广度优先搜索法的相关文章

总结深度优先与广度优先的区别

1.区别 1) 二叉树的深度优先遍历的非递归的通用做法是采用栈,广度优先遍历的非递归的通用做法是采用队列. 2) 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历.中序遍历.后序遍历.具体说明如下: 先序遍历:对任一子树,先访问根,然后遍历其左子树,最后遍历其右子树. 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树. 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后

理解广度优先搜索

1.   定义 BFS是Breath First Search的缩写,是广度优先搜索的意思,是图的遍历方式的一种. 由于BFS是从起点一层一层的进行搜索的,所以凡是需要求最短路径的问题,都可以尝试看BFS能否解决,比如Dijkstra的单源最短路径算法使用了BFS的思想.另外,在执行广度优先搜索的过程中将构造出一棵树,这也是Prim的最小生成树算法思想.在做BFS的时候,有两点需要特别注意: 1.      为了防止搜索进入无限循环,节点需要判重,也就是已经访问过的节点不要再访问了,所以需要记录

深度优先搜索和广度优先搜索的深入讨论

一.深度优先搜索和广度优先搜索的深入讨论 (一)深度优先搜索的特点是: (1)从上面几个实例看出,可以用深度优先搜索的方法处理的题目是各种各样的.有的搜索深度是已知和固定的,如例题2-4,2-5,2-6:有的是未知的,如例题2-7.例题2-8:有的搜索深度是有限制的,但达到目标的深度是不定的. 但也看到,无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生规则以及输出要求. (2)深

深度优先和广度优先算法

1.深度优先算法 遍历规则:不断地沿着顶点的深度方向遍历.顶点的深度方向是指它的邻接点方向. 最后得出的结果为:ABDECFHG. Python代码实现的伪代码如下: 2.广度优先算法: 遍历规则: 1)先访问完当前顶点的所有邻接点.(应该看得出广度的意思) 2)先访问顶点的邻接点先于后访问顶点的邻接点被访问. 最后得出的结果为:ABCDEFGH. Python代码实现的伪代码如下: 3.总结 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二

深度优先搜索和广度优先搜索的比较与分(转)

深度优先搜索和广度优先搜索的深入讨论   (一)深度优先搜索的特点是: (1)无论问题的内容和性质以及求解要求如何不同,它们的程序结构都是相同的,即都是深度优先算法(一)和深度优先算法(二)中描述的算法结构,不相同的仅仅是存储结点数据结构和产生规则以及输出要求. (2)深度优先搜索法有递归以及非递归两种设计方法.一般的,当搜索深度较小.问题递归方式比较明显时,用递归方法设计好,它可以使得程序结构更简捷易懂.当搜索深度较大时,当数据量较大时,由于系统堆栈容量的限制,递归容易产生溢出,用非递归方法设

了解搜索引擎来进行SEO

搜索引擎的工作的过程非常复杂,而简单的讲搜索引擎的工过程大体可以分成三个阶段.爬行和抓取:搜索引擎蜘蛛通过跟踪链接访问页面,获取页面HTML代码存入数据库.预处理:搜索赢球对抓取来的页面数据文字进行文字提取.中文分词.索引等处理,以备排名程序调用.排名:用户输入关键字后,排名调用索引库数据,计算相关性,然后按一定格式生成搜索结果页面. 爬行和抓取 爬行和抓取是搜索引擎工作的第一步,完成数据收集任务. 蜘蛛 搜索引擎用来爬行和访问页面的程序被称为蜘蛛(spider),也称为机器人(bot). 蜘蛛

【转】八数码问题及A*算法

一.八数码问题八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个空格,与空格相邻的棋子可以移到空格中.要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤.所谓问题的一个状态就是棋子在棋盘上的一种摆法.棋子移动后,状态就会发生改变.解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态.八数码问题一般使用搜索法来解.搜索法有广度优先搜索法.深度优

数据结构快速回顾——图的遍历

图的遍历指的是从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次.图的遍历操作和树的遍历操作功能相似.图的遍历是图的一种基本操作,图的许多其它操作都是建立在遍历操作的基础之上. 图的遍历方法目前有深度优先搜索法和广度(宽度)优先搜索法两种算法. 深度优先搜索法DFS 深度优先搜索法的基本思想是:从图G的某个顶点v0出发,访问v0,然后选择一个与v0相邻且没被访问过的顶点vi访问,再从vi出发选择一个与vi相邻且未被访问的顶点vj进行访问,依次继续.如果当前被访问过的顶点的所有邻接顶点都已

九宫格问题 A*

八数码问题 一.八数码问题八数码问题也称为九宫问题.在3×3的棋盘,摆有八个棋子,每个棋子上标有1至8的某一数字,不同棋子上标的数字不相同.棋盘上还有一个空格,与空格相邻的棋子可以移到空格中.要求解决的问题是:给出一个初始状态和一个目标状态,找出一种从初始转变成目标状态的移动棋子步数最少的移动步骤.所谓问题的一个状态就是棋子在棋盘上的一种摆法.棋子移动后,状态就会发生改变.解八数码问题实际上就是找出从初始状态到达目标状态所经过的一系列中间过渡状态.八数码问题一般使用搜索法来解.搜索法有广度优先搜