搜尋演算法之迷宮問題

2021-07-24 12:20:44 字數 1956 閱讀 9544

給定乙個n×m方格的迷宮,迷宮裡有t處障礙,障礙處不可通過。給定起點座標和終點座標,問每個方格最多經過1次,在迷宮中移動有上下左右四種方式,保證起點上沒有障礙。問:

① 有多少種從起點座標到終點座標的方案?

② 從起點到終點的最短路徑長度是多少?輸出一條長度最短的路徑經過的點的座標,若不

存在起點到終點的路徑,則輸出-1.

第一行n、m和t,其中:n為行數,m為列數,t為障礙數。

第二行起點座標sx、sy,終點座標ex、ey。

接下來t行,每行為障礙的座標。

第一行從起點座標到終點座標的方案總數。

若存在解答,則第二行輸出最短路徑的長度len(起點和終點也算在步數內),以下len行,每行輸出經過點的座標(i, j);

否則無解時輸出-1

4 5 4

0 0 3 4

0 2

1 1

2 3

3 1

3

8 (0, 0)

(1, 0)

(2, 0)

(2, 1)

(2, 2)

(3, 2)

(3, 3)

(3, 4)

使用深搜和廣搜

#include 

#include

#include

#define max 150

intmap[max][max],book[max][max],path[max][2]; //地圖和標記

int n,m,t,sx,sy,ex,ey; //行、列、障礙數、起點座標、終點座標

int num=0; //方案總數

int dir[4][2]=, //右

, //下

, //左

, //上

};struct nodequeue[max];

int head,tail; //佇列的頭尾指標

int go(int x, int y)

void dfs(int x, int y)

for (int k=0; k<4; k++)

}return ;

}void bfs(int x, int y)

}head++;

bfs(queue[head].x, queue[head].y);

}int main()

book[sx][sy]=1;

dfs(sx, sy);

memset(book, 0, sizeof(book)); //初始化標記和頭尾指標

head=tail=0;

queue[tail].x=sx;

queue[tail].y=sy;

queue[tail].len=1;

queue[tail].f=0;

tail++;

printf("%d\n", num);

bfs(sx, sy);

len=queue[--tail].len;

printf("%d\n", len);

i=tail;

j=len-1;

path[j][0]=ex;path[j][1]=ey;

j--;

while (i>1)

for (j=0; jprintf("(%d,%d)\n", path[j][0], path[j][1]);

//fclose(stdin);

return

0;}

搜尋演算法(迷宮問題)

盼來盼去終於又要開始學習演算法了!筆者自學演算法,所以學習順序以個人舒服的形式!用例子來看 問題 有乙個迷宮,以1 2形式來表示 1表示是空地,即可以行走,2表示是障礙物,即無法通行。該迷宮由乙個矩陣形式表示。即1 1 2 1 1 1 1 1 1 1 2 1 1 2 1 1 1 1 1 2 有終點和...

演算法基礎 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...