1. 程式人生 > >廣度優先搜索法

廣度優先搜索法

rgs one 1.0 入隊 port 取出 廣度優先搜索 mini auth

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

廣度優先搜索法