广度优先搜索法

mac2022-06-30  75

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)); } } }}

 

转载于:https://www.cnblogs.com/1x-zfd50/p/6958299.html

相关资源:从广度优先搜索,深度优先搜索,A*算法多方面算法来解决八数码问题
最新回复(0)