搜尋演算法(迷宮問題)

2021-10-21 11:43:00 字數 2114 閱讀 2781

盼來盼去終於又要開始學習演算法了!

筆者自學演算法,所以學習順序以個人舒服的形式!

用例子來看:

問題:有乙個迷宮,以1 2形式來表示————1表示是空地,即可以行走,2表示是障礙物,即無法通行。該迷宮由乙個矩陣形式表示。

即1  1  2  1

1  1  1  1

1  1  2  1

1  2  1  1

1  1  1  2

有終點和起點,我們需要計算從起點到達終點的最短路徑!

準備**為

int q,p,step;

//(p,q)為終點座標

int mmin=

999999

;int a[

100]

[100];

//1表示空地//2表示障礙物

int v[

100]

[100];

//1表示訪問//0表示未訪問

解析**為(優先理解該**,方便後面理解)

void

dfs(

int x,

int y,

int step)

//順時針試探

//→if

(a[x]

[y+1]==

1&&v[x]

[y+1]==

0)//↓if

(a[x+1]

[y]==

1&&v[x+1]

[y]==0)

//←if

(a[x]

[y-1]==

1&&v[x]

[y-1]==

0)//↑if

(a[x-1]

[y]==

1&&v[x-1]

[y]==0)

return

;}

優化**為

int dx[4]

=;int dy[4]

=;void

dfs(

int x,

int y,

int step)

//順時針試探

for(

int k=

0;k<=

3;k++)}

return

;}

int main()

int

main

(int argc,

char

*ar**)

}int qi,z;

cin>>qi>>z>>p>>q;

v[qi]

[z]=1;

dfs(qi,z,0)

; cout<

return0;

}

測試資料:

5 41 1 2 1

1 1 1 1

1 1 2 1

1 2 1 1

1 1 1 2

1 1 4 3

結果為7

理解:

在筆者看來,任何知識的運用首先應該是從定義理解出發,只有明白了最基本的意義才能夠熟悉並且巧妙的運用,因此在介紹bfs時,我想先從定義上入手,再去解決問題。

int a[

100]

[100];

int v[

100]

[100];

struct point

;queue r;

//申請佇列

int dx[4]

=;int dy[4]

=;intmain

(int argc,

char

* ar**)

for(

int k =

0; k <=

3; k++)}

r.pop();

//拓展完了需要將對首元素出隊}if

(flag ==0)

return0;

}

搜尋演算法之迷宮問題

給定乙個n m方格的迷宮,迷宮裡有t處障礙,障礙處不可通過。給定起點座標和終點座標,問每個方格最多經過1次,在迷宮中移動有上下左右四種方式,保證起點上沒有障礙。問 有多少種從起點座標到終點座標的方案?從起點到終點的最短路徑長度是多少?輸出一條長度最短的路徑經過的點的座標,若不 存在起點到終點的路徑,...

演算法基礎 4127 迷宮問題 廣度優先搜尋演算法

題目 定義乙個矩陣 0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。輸入 乙個5 5的二維陣列,表示乙個迷宮。資料保證...

走迷宮 廣度優先搜尋演算法

假設有如下的迷宮 迷宮0 1000 0001 0010 1011 1000 1001 0100 0 其中0表示可走,1表示牆壁,只能按上下左右的方向走,請問從左上角走到右下角哪條路最短?這裡就以廣度優先搜尋演算法來探索走法。過程如下 下面給出php和go的示例 define maze file di...