給定乙個n×m方格的迷宮,迷宮裡有t處障礙,障礙處不可通過。給定起點座標和終點座標,問每個方格最多經過1次,在迷宮中移動有上下左右四種方式,保證起點上沒有障礙。問:
① 有多少種從起點座標到終點座標的方案?
② 從起點到終點的最短路徑長度是多少?輸出一條長度最短的路徑經過的點的座標,若不
存在起點到終點的路徑,則輸出-1.
第一行n、m和t,其中:n為行數,m為列數,t為障礙數。
第二行起點座標sx、sy,終點座標ex、ey。
接下來t行,每行為障礙的座標。
第一行從起點座標到終點座標的方案總數。
若存在解答,則第二行輸出最短路徑的長度len(起點和終點也算在步數內),以下len行,每行輸出經過點的座標(i, j);
否則無解時輸出-1
4 5 40 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...