BFS(廣度優先搜尋)解決迷宮問題(JAVA實現)

2021-08-15 10:54:18 字數 1890 閱讀 5939

問題:

迷宮問題:現有乙個m*n的方陣,其中有若干個路障,先要求求出從出發點s到終點e的最短路徑,跨越每個方格的時間固定,均為1。

思路:本題的解答可以用廣度優先搜尋(bfs)來做,廣度優先搜尋本質上是動態規劃的一種應用,先求出演算法第一步中所有的可行解,然後對解空間中的每乙個可行解依次執行演算法的下乙個步驟,從而得到乙個新的解空間。最後得到若干個(或乙個)可行解。

對於本題來說,先通過起點求出所有一步(step1)內可以直接達到的位置,將其全部存入佇列,由於佇列訪問資料先進先出的特點,遍歷得到的新的解空間總是依次存放在上一步解空間(step1)最後乙個解後面,所以可以達到先遍歷出演算法上一步(step1)解空間所有解,然後再將每乙個解對應的新的解空間(step2)依次加入佇列的效果。然後對新的解空間實行上述操作,直到得到的解空間中存在終點為止。

注意事項:

1,對於每乙個點設定乙個標記,用來標記是否來過(flag)。如果來過,說明已經對該解已經加入過佇列進行運算,再次運算無法得到更優的解,故直接捨棄,轉而判斷下乙個解。

2,此種方法一旦得到的解一定是最優解。為何?  根據動態規劃的原理,問題被分為了相同單位時間相同的若干步。每一步都可以得到當前情況下所有的可行解,所以相當於涵蓋了問題所有的解空間,其中一定含有最優解的路徑。而遍歷到整個答案的可行解時,這表示這是用最短步數(時間)達到的可行解,即最優解。由一1也可知即使回溯到上一步也無法找到更優的解法。

**如下:

首先對每個節點設定屬性:

package sort;

public class block

public void sethowfar(int howfar)

public int getx()

public void setx(int x)

public int gety()

public void sety(int y)

public boolean getflag()

public void setflag(boolean flag)

public int getvalue()

public void setvalue(int value)

}

bfs求迷宮最短路徑

public class harrystair 

} private int findway() 將已經到達的點移出佇列

block b = (block) q.poll();

" "+b.gety());

if (b.getflag() == true)

continue;

獲取從該點可以直接到達的節點

if (b.getx()>=1&&b.getx()<=maplength&&b.gety()>=0&&b.gety()<=maplength-1)

if (b.getx()>=0&&b.getx()<=maplength-1&&b.gety()>=0&&b.gety()<=maplength-2)

if (b.getx()>=0&&b.getx()<=map.length-1&&b.gety()>=1&&b.gety()<=maplength)

b.setflag(true);

}} return distance;

} //對節點進行判斷並修改

private void dealway(block b, block forntb)

} public static void main(string args) , , , , };

h.start(map);

system.out.println(h.findway());

}}

迷宮問題(廣度優先搜尋BFS

給定乙個迷宮,入口為左上角,出口為右下角,問是否有路徑從入口到出口,若有則輸出一條這樣的路徑。注意移動可以從上 下 左 右 上左 上右 下左 下右八個方向進行。迷宮輸入0表示可走,輸入1表示牆。易得可以用1將迷宮圍起來避免邊界問題。本題採用bfs演算法給出解。注意,利用bfs演算法給出的路徑必然是一...

迷宮問題 BFS(廣度優先搜尋)

之前寫迷宮問題用的都是遞迴求解,採用的是dfs深度優先搜尋,從來沒有想到過用廣度優先搜尋,這次碰到了乙個迷宮題,之前的dfs不太合適。題目鏈結點此 假設乙個探險家被困在了地底的迷宮之中,要從當前位置開始找到一條通往迷宮出口的路徑。迷宮可以用乙個二維矩陣組成,有的部分是牆,有的部分是路。迷宮之中有的路...

迷宮 BFS 廣度優先搜尋

小c最近在研究機械人,他想看看自己的機械人夠不夠智慧型,於是他將機械人放在乙個n m的迷宮中,看看機械人能不能在最短的時間內到達目的地,可是小c不知道最短的時間是多少,現在請你幫他算算機械人到達目的地的最短時間是多少?輸入描述 輸入資料第一行兩個整數n和m。n和m的範圍 10,500 接下來n行,每...