BFS (迷宮的最短路徑)
阿新 • • 發佈:2018-11-15
迷宮的最短路徑
給定一個大小為N * M 的迷宮。迷宮由通道和牆壁組成,每一步可以向鄰接的上下左右四格的通道移動。請求出從起點到終點所需的最小步數。請注意,本題假定從起點一定可以移動到終點 。
限制條件: N , M<=100 。( # . S G 分別代表 牆壁、通道、起點和終點。)
sample input
10 10
# | S | # | # | # | # | # | # | . | # |
. | . | . | . | . | . | # | . | . | # |
. | # | . | # | # | . | # | # | . | # |
. | # | . | . | . | . | . | . | . | . |
# | # | . | # | # | . | # | # | # | # |
. | . | . | . | # | . | . | . | . | # |
. | # | # | # | # | # | # | # | . | # |
. | . | . | . | # | . | . | . | . | . |
. | # | # | # | # | . | # | # | # | . |
. | . | . | . | # | . | . | . | G | # |
sample output
22
解題思路: 走迷宮,而且是最短的路徑,可以用寬度優先搜尋按照開始狀態由近及遠的順序進行搜尋。
用pair<int ,int > 來表示狀態(座標),d[MAX] [MAX]陣列來表示所走的步數(d[MAX] [MAX]應與迷宮一樣大,d[MAX] [MAX] 上座標的數值代表從S出發走到該座標的步數)。
首先把S點的位置放入佇列裡(把初始狀態放入佇列裡)並設定步數為0 ,然後朝四個方向搜尋(轉移),把可以轉移的並且未訪問的狀態加入佇列裡面(步數加一 ),如此往復直到搜尋到終點的位置或佇列為空。
#include<stdio.h>
#include<queue>
#define MAX_N 100
#define MAX_M 100
using namespace std;
const int INF = 100000000;
typedef pair<int,int > P;
char maze[MAX_N][MAX_M+1];
int N,M;
int sx,sy;
int gx,gy;
int d[MAX_N][MAX_M+1];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int bfs()
{
queue<P> que;
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
d[i][j] = INF; // 初始化所有點的距離為INF
}
}
que.push(P(sx,sy)); // 把起點加入佇列,並設距離為 0
d[sx][sy] = 0;
while(que.size())
{
P p = que.front(); que.pop();
if(p.first == gx && p.second == gy) break; // 如果取出的狀態是終點,則搜尋結束
for(int i=0;i<4;i++)
{
int nx = p.first + dx[i];
int ny = p.second + dy[i];
if(0 <= nx && nx < N && 0 <= ny && ny < M && maze[nx][ny] != '#' && d[nx][ny] == INF)
{
que.push(P(nx,ny));
d[nx][ny] = d[p.first][p.second] + 1;
}
}
}
return d[gx][gy];
}
int main()
{
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++)
scanf("%s",maze[i]);
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
if(maze[i][j]=='S')
{
sx=i; // 起點位置
sy=j;
}
if(maze[i][j]=='G')
{
gx=i; // 終點位置
gy=j;
}
}
}
int res = bfs();
printf("%d\n",res);
return 0;
}
在這立個flag:
1. 每週寫一篇有質量的blog(這幾篇太水了,簡直無法直視。。。)
2. 每週安排自己相應的學習任務(快點學啊。。。)
3. TA 現在很好所以你可以放心了(這個不是flag。。。)