POJ3984迷宮問題

2021-09-23 15:35:46 字數 1285 閱讀 8626

日常安利本題我的部落格

給出乙個5×5的數字矩陣其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。

事實證明,bfs對這種數字矩陣的處理能力明顯不如dfs,bfs對距離矩陣的處理更強。

之前對圖的處理多是那種鄰接矩陣的處理,但是對這種數字矩陣的處理要差很多,剛開始做法大體是知道,但是程式設計時卻有點蒙,基礎太差了。

首先,回憶一下bfs。bfs就是廣度優先搜尋,從起始點開始,將這個點相連的點加入到佇列之中,標記經過的點,然後依次將佇列中的點取出,然後加入與這個點相連的點(要並未訪問過的),因為佇列先進先出的規律,所以就可以分層次遍歷途中所有點。這裡值得注意的是,由於是從開始分層遍歷,所以先經過的點一定是最優的。即如果某個點是最短路的必經之路,那麼第一次訪問它的前乙個節點也一定是必經之路。通過這個特點,就可以在將點加入佇列的時候,順便記錄一下他的父親節點(即這個節點的上乙個節點)。這樣通過隊最後乙個節點開始遞迴,就可以找到最短路徑了。

記錄路徑時,因為這個圖只有上下左右四個方向,所以可以通過方向記錄,空間上這麼做更為優秀,但是為了之後處理距離矩陣的圖,所以用struct陣列存點的路徑。另外我的**並沒有採用遞迴,而是使用差不多的棧結構。在路徑比較長時,可以使用vector代替,但是本題不需要,我就懶著了吧_。

#include#include#include#include#include#include#include #includeusing namespace std ;

#define mem(a) memset(a,0,sizeof(a))

#define ll long long

const double eps = 1e-8;

const int maxn = 110010;//須填寫

const int inf = 0x3f3f3f3f;

int dir[4][2]=;

int vis[10][10];

int pic[10][10];

struct node

;node way[10][10];

void bfs(node node)}}

}int main()

}node node;

stacks;

node.x=0;

node.y=0;

bfs(node);

node.x=4;

node.y=4;

while(node.x!=-1)

while(!s.empty())

return 0;

}

POJ3984 迷宮問題

題目 迷宮問題 time limit 1000ms memory limit 65536k total submissions 3183 accepted 1861 description 定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎...

POJ 3984 迷宮問題

一道比較簡單的bfs題 include include include include define max 6 using namespace std int map max max px max max py max max int movex 4 movey 4 bool vis max ma...

POJ 3984 迷宮問題

迷宮問題 time limit 1000ms memory limit 65536k total submissions 7047 accepted 4123 description 定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,...