盼來盼去終於又要開始學習演算法了!用例子來看:筆者自學演算法,所以學習順序以個人舒服的形式!
問題:有乙個迷宮,以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...