第一次寫部落格,希望能把基礎的演算法記錄下來,以後快要忘記了可以拿來複習。
題目:
輸入輸出要求:
樣例:
輸入樣例:
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...