1. 程式人生 > >BFS (迷宮的最短路徑)

BFS (迷宮的最短路徑)

 


迷宮的最短路徑

給定一個大小為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。。。)