java廣度優先演算法
『壹』 java連連看使用廣度優先演算法實現,求具體解釋廣度優先演算法和代碼
void bfs(TreeNode t){
Queue q = new LinkedList<TreeNode>();
q.enqueue(t);
while(!q.isEmpty && q.peek().element != null){
TreeNode temp = q.dequeue();
System.out.println(temp.element);
q.enqueue(temp.leftchild);
q.enqueue(temp.rightchild);
}
}
class TreeNode <AnyType>{
AnyType element;
TreeNode rightchild;
TreeNode leftchild;
}
『貳』 java如何實現 深度優先 廣度優先
下面是我修改了滴源碼,是基於一張簡單的地圖,在地圖上搜索目的節點,依次用深度優先、廣度優先、Dijkstra演算法實現。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Stack;
/**
*
* @author yinzhuo
*
*/
public class Arithmatic {
boolean flag = true;
// 一張地圖
static int[][] map = new int[][]// 地圖數組
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
『叄』 求高手,給兩到三個廣度優先的例子,Java最好,C++的不要出現指針。最好還有詳細的說明,謝謝
是不是圖的廣度優先搜索?我也在正在學著數據結構,湊巧就有個這個函數,給你看看。有需要拿完整程序再說。廣度優先和深度優先的都給你。
這里用的是鄰接矩陣為1就是聯通了,為0就是斷開的。
public void dfs(){ 深度優先
vertexList[0].wasVisited=true; 設置訪問標記 vertexList[]為頂點數組,每個頂點類帶有訪問標記和標簽(類裡面的各種信息變數)
displayVertex(0);
theStack.push(0); 壓棧
while(!theStack.isEmpty()){ 為空不操作,不為空操作
int v=getAdjUnvisitedVertex(theStack.peek()); 看棧的當前值
if(v==-1) 如果沒有鄰接點
theStack.pop(); 出棧
else{ 有鄰接點就繼續讓鄰接點入棧
vertexList[v].wasVisited=true; 置為已訪問
displayVertex(v); 輸出頂點
theStack.push(v); 壓棧
}
}
for(int j=0;j<nVerts;j++)
vertexList[j].wasVisited=false; 初始化訪問標志,避免使用標志的時候都成了true
}
public void bfs(){ 廣度優先
vertexList[0].wasVisited=true; 設置為已經搜索過
displayVertex(0); 輸出
theQueue.insert(0); 隊列插入
int v2;
while(!theQueue.isEmpty()){
int v1=theQueue.remove(); 出隊
while((v2=getAdjUnvisitedVertex(v1))!=-1){ 如果沒有鄰接點不操作,有繼續操作,此時會完成給v2更新賦值的操作
vertexList[v2].wasVisited=true;
displayVertex(v2);
theQueue.insert(v2); 不斷讓新的鄰接點坐標入隊
}
}
for(int j=0;j<nVerts;j++)
vertexList[j].wasVisited=false;
}
public int getAdjUnvisitedVertex(int v){
for(int i=0;i<nVerts;i++)
if(adjMat[v][i]==1&&vertexList[i].wasVisited==false)
return i; 返回和該點相鄰且未被訪問的點下標(有return就不用break了)
return -1;
}
『肆』 深度優先和廣度優先 的區別 ,用法。
1、主體區別
深度優先搜索是一種在開發爬蟲早期使用較多的方法。它的目的是要達到被搜索結構的葉結點(即那些不包含任何超鏈的HTML文件)。
寬度優先搜索演算法(又稱廣度優先搜索)是最簡便的圖的搜索演算法之一,這一演算法也是很多重要的圖的演算法的原型。
2、演算法區別
深度優先搜索是每次從棧中彈出一個元素,搜索所有在它下一級的元素,把這些元素壓入棧中。並把這個元素記為它下一級元素的前驅,找到所要找的元素時結束程序。
廣度優先搜索是每次從隊列的頭部取出一個元素,查看這個元素所有的下一級元素,把它們放到隊列的末尾。並把這個元素記為它下一級元素的前驅,找到所要找的元素時結束程序。
3、用法
廣度優先屬於一種盲目搜尋法,目的是系統地展開並檢查圖中的所有節點,以找尋結果。換句話說,它並不考慮結果的可能位置,徹底地搜索整張圖,直到找到結果為止。
深度優先即在搜索其餘的超鏈結果之前必須先完整地搜索單獨的一條鏈。深度優先搜索沿著HTML文件上的超鏈走到不能再深入為止,然後返回到某一個HTML文件,再繼續選擇該HTML文件中的其他超鏈。
(4)java廣度優先演算法擴展閱讀:
實際應用
BFS在求解最短路徑或者最短步數上有很多的應用,應用最多的是在走迷宮上,單獨寫代碼有點泛化,取來自九度1335闖迷宮一例說明,並給出C++/Java的具體實現。
在一個n*n的矩陣里走,從原點(0,0)開始走到終點(n-1,n-1),只能上下左右4個方向走,只能在給定的矩陣里走,求最短步數。n*n是01矩陣,0代表該格子沒有障礙,為1表示有障礙物。
int mazeArr[maxn][maxn]; //表示的是01矩陣int stepArr = {{-1,0},{1,0},{0,-1},{0,1}}; //表示上下左右4個方向,int visit[maxn][maxn]; //表示該點是否被訪問過,防止回溯,回溯很耗時。核心代碼。基本上所有的BFS問題都可以使用類似的代碼來解決。
『伍』 java高手們可否提供一個廣度優先搜索的樣例,並簡要解釋一下該演算法……
void bfs(TreeNode t){
Queue q = new LinkedList<TreeNode>();
q.enqueue(t);
while(!q.isEmpty && q.peek().element != null){
TreeNode temp = q.dequeue();
System.out.println(temp.element);
q.enqueue(temp.leftchild);
q.enqueue(temp.rightchild);
}
}
class TreeNode <AnyType>{
AnyType element;
TreeNode rightchild;
TreeNode leftchild;
}
『陸』 (急)編寫一個java工程,隨機自動生成一個迷宮,並分別運用廣度優先和深度優先算出入口到出口的路徑
『柒』 廣度優先演算法
廣度優先演算法(Breadth-First Search),同廣度優先搜索,又稱作寬度優先搜索,或橫向優先搜索,簡稱BFS,是一種圖形搜索演演算法。簡單的說,BFS是從根節點開始,沿著樹的寬度遍歷樹的節點,如果發現目標,則演算終止。廣度優先搜索的實現一般採用open-closed表。
『捌』 大學java中都學過哪些經典演算法請學過的朋友解答下
¤ 歸並排序演算法
¤ 枚舉法
¤ 數字全排列問題
¤ 優化高精度減法
¤ 高精度階乘
¤ 高精度減法
¤ 高精度乘法
¤ Dijkstra最短路徑(一點到各頂點最短路徑)
¤ 八皇後問題
¤ 快速排序演算法
¤ 地圖四色問題
¤ 穿越迷宮
¤ 常用排序演算法
¤ 二分查找法完整版
¤ 標准快速排序演算法
¤ 一躺快速排序法
¤ 快速排序演算法
¤ 插入排序演算法
¤ 選擇排序演算法
¤ 冒泡排序演算法
¤ 統計演算法
¤ 常用演算法——廣度優先搜索
¤ 常用演算法——深度優先搜索
『玖』 Java連連看代碼。 廣度優先搜索演算法實現,最小拐彎數,高手留下qq。
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class lianliankan implements ActionListener
{
JFrame mainFrame; //主面板
Container thisContainer;
JPanel centerPanel,southPanel,northPanel; //子面板
JButton diamondsButton[][] = new JButton[6][5];//游戲按鈕數組
JButton exitButton,resetButton,newlyButton; //退出,重列,重新開始按鈕 JLabel fractionLable=new JLabel("0"); //分數標簽
JButton firstButton,secondButton; //分別記錄兩次被選中的按鈕
int grid[][] = new int[8][7];//儲存游戲按鈕位置
static boolean pressInformation=false; //判斷是否有按鈕被選中
int x0=0,y0=0,x=0,y=0,fristMsg=0,secondMsg=0,validateLV; //游戲按鈕的位置坐標 int i,j,k,n;//消除方法控制
public void init(){
mainFrame=new JFrame("JKJ連連看");
thisContainer = mainFrame.getContentPane();
thisContainer.setLayout(new BorderLayout());
centerPanel=new JPanel();
southPanel=new JPanel();
northPanel=new JPanel();
thisContainer.add(centerPanel,"Center");
thisContainer.add(southPanel,"South");
thisContainer.add(northPanel,"North");
centerPanel.setLayout(new GridLayout(6,5));
for(int cols = 0;cols < 6;cols++){
for(int rows = 0;rows < 5;rows++ ){
diamondsButton[cols][rows]=new JButton(String.valueOf(grid[cols+1][rows+1])); diamondsButton[cols][rows].addActionListener(this);
centerPanel.add(diamondsButton[cols][rows]);
}
}
exitButton=new JButton("退出");
exitButton.addActionListener(this);
resetButton=new JButton("重列");
resetButton.addActionListener(this);
newlyButton=new JButton("再來一局");
newlyButton.addActionListener(this);
southPanel.add(exitButton);
southPanel.add(resetButton);
1/8頁
southPanel.add(newlyButton);
fractionLable.setText(String.valueOf(Integer.parseInt(fractionLable.getText())));
northPanel.add(fractionLable);
mainFrame.setBounds(280,100,500,450);
mainFrame.setVisible(true);
}
public void randomBuild() {
int randoms,cols,rows;
for(int twins=1;twins<=15;twins++) {
randoms=(int)(Math.random()*25+1);
for(int alike=1;alike<=2;alike++) {
cols=(int)(Math.random()*6+1);
rows=(int)(Math.random()*5+1);
while(grid[cols][rows]!=0) {
cols=(int)(Math.random()*6+1);
rows=
『拾』 廣度優先 演算法,各位幫幫。。急
個人對廣度優先演算法的理解是每次優先遍歷父結點下的直接子結點,遍歷完這些直接子結點之後再從這些子結點開始遍歷他們的直接子結點,以此類推下去,直到找到終點。所以,此處肯定是需要使用到迭代了。在此我想寫出我的思路來與樓主交流下。
1.確定startway點和endway點以後,找到startway點,並對該點下的子結點進行遍歷。如你此處選擇的startway是牧野草原04 即位置在ab(04),endway是牧野草原15,那麼ab(04)下的直接子結點可認為是牧野草原06、牧野草原08和牧野草原10。我們開始按照廣度優先演算法遍歷到牧野草原15。
2.首先我們遍歷完04的子結點(06,08,10),發現沒有15。
3.接下來我們遍歷結點06的子結點(04,05,03),發現沒有15.
4.然後,我們開始遍歷結點08的子結點(4,15,16),發現15,於是整個遍歷結束。
PS:對於迴路的子結點不應該考慮遍歷,比如06中04的迴路。