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