迷宮尋路(bfs)

2021-10-24 16:23:56 字數 2115 閱讀 2214

第一次寫部落格,希望能把基礎的演算法記錄下來,以後快要忘記了可以拿來複習。

題目:

輸入輸出要求:

樣例:

輸入樣例:

8 8

0 0 1 0 0 0 1 0

0 0 1 0 0 0 1 0

0 0 0 0 1 1 0 0

0 1 1 1 0 0 0 0

0 0 0 1 0 0 0 0

0 1 0 0 0 1 0 0

0 1 1 1 0 1 1 0

1 0 0 0 0 0 0 0

4 4

0 0 1 0

0 0 0 0

0 0 1 1

0 1 0 0

-1 -1

輸出樣例:

1,12,1

3,14,1

5,15,2

5,36,3

6,46,5

7,58,5

8,68,7

8,8no found

思路:

廣度優先搜尋,找到出路。

使用佇列,逐層尋找出路。

具體實現:先將起點push進佇列裡,然後將四個方向能夠走的位置push進佇列裡,並且把起點pop出去。然後將佇列中的第乙個結點當作起點重複操作。

為了防止走回頭路,每push進佇列中乙個位置,就要乙個vis陣列標記上,下次檢測到這個位置也不再走這個位置。

注意:這個題需要輸出路徑,所以需要乙個陣列來記錄路徑。

就是用乙個陣列標記上每個位置的父親位置,雖然每個父親位置可能有很多子位置,但每個子位置只有乙個父親位置。所以可以從最後乙個位置開始倒推出路徑。

我第一次用的棧,記憶體超限了,又用了個遞迴,然後經過了無數次創造bug,找bug,最後過了。(格式錯誤真的很煩,這個裡面要求輸出no found的時候不用空一行了)

**:

#include

#include

#include

#include

using

namespace std;

const

int maxx=50;

struct point

;point fu[maxx]

[maxx]

;queue q;

int go[4]

[2]=

,,,}

;int map[maxx]

[maxx]

,cnt;

//int vis[10][10]=;

int m,n;

intpan

(int xx,

int yy)

return0;

}int

bfs(

)for

(int i=

0;i<

4;i++)}

}return0;

}/*inline void printlu()

s.push(fu[i][j]);

int t=i;

i=fu[i][j].x;

j=fu[t][j].y;

} point qi;

qi.x=0;

qi.y=0;

s.push(qi);

while(!s.empty())

else

cout<

}int

main()

}if(!

bfs())

else

}return0;

}

go陣列是用來算下乙個位置的。

pan函式是判斷位置是否越界(走出迷宮了)。

注釋掉的部分是用stack輸出的方法,出來的答案是對了,但是記憶體超限了,害。

後邊的printlu函式遞迴輸出路徑(因為咱們是從後往前儲存路徑的)

python迷宮尋路 迷宮尋路問題 A 演算法

迷宮尋路問題 a 演算法 迷宮尋路問題是人工智慧中的有趣問題,如何表示狀態空間和搜尋路徑是尋路問題的重點,本文的主要內容是a 搜尋演算法的理解和應用,首先對基本知識和演算法思想進行了解,再通過其對迷宮問題求解應用,編寫 python 程式進行深入學習。1.搜尋區域 我們假設某個人要從 start 點...

迷宮尋路(A星尋路演算法)

題目 假設我們有乙個7 5大小的迷宮,如下圖所示,綠色格仔表示起點,紅色的格仔表示終點,中間的3個深灰色格仔表示障礙物。請找到一條從起點到終點最短的路徑。解題思路 需要引入兩個集合和乙個公式,如下 具體步驟 把起點放入openlist 檢查openlist中是否有值,如果沒有則無法到達終點,結束尋路...

Qt 迷宮自動尋路

標頭檔案 ifndef widget h define widget h include include include include include include include include include includeusing namespace std struct mypoint...