挑战程序设计竞赛 2.1迷宫的最短路径

来源:互联网 发布:vue组件引用js插件 编辑:程序博客网 时间:2024/06/05 04:32
  迷宫的最短路径

       给定一个大小为N*M 的迷宫,迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四个格的通道移动。请求出从起点到终点所需要的最小步数,请注意,本体假设从起点一定可以移动到终点。

       限制条件:N,M <= 100

       输入:

       #S######. #

       .. . . . . # . . #

       .# . ## . ##.#

       .# . . . . . . . .

       ##.## . ####

       .. . . # . . . .#

       .#######. #

       .. . . # . . . . .

       .#### . ### .

       .. . . # . . .G#

       输出

              22

#include <iostream>#include <queue> using namespace std; #define MAX_N 10#define MAX_M 10 const int INF = 100000000; typedef pair<int ,int> P; char maze[MAX_N][MAX_M+1] ={    { '#', 'S', '#' , '#','#', '#', '#', '#', '.', '#'},    { '.', '.', '.' , '.','.', '.', '#', '.', '.', '#'},    { '.', '#', '.' , '#','#', '.', '#', '#', '.', '#'},    { '.', '#', '.' , '.','.', '.', '.', '.', '.', '.'},    { '#', '#', '.' , '#','#', '.', '#', '#', '#', '#'},    { '.', '.', '.' , '.','#', '.', '.', '.', '.', '#'},    { '.', '#', '#' , '#','#', '#', '#', '#', '.', '#'},    { '.', '.', '.' , '.','#', '.', '.', '.', '.', '.'},    { '.', '#', '#' , '#','#', '.', '#', '#', '#', '.'},    { '.', '.', '.' , '.','#', '.', '.', '.', 'G', '#'},}; int N = 10, M = 10;int sx = 0;int sy = 1;int gx = 9;int gy = 8;int d[MAX_N][MAX_M];int dx[4] = {1, 0, -1, 0}, dy[] = { 0, 1, 0, -1}; int bfs(){    queue<P> que;    // 初始化所有距离为INF    for( int i = 0; i < N;i++)    {        for( int j = 0; j <M; j++)        {            d[i][j] = INF;        }    }     // 将起点加入队列,并将这一点的距离设置为0    que.push(P(sx, sy));    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];             // 判断是否可以移动以及是否已经访问过(d[nx][ny] != INF即已经访问过)            if(0<= nx&& nx < N && 0 <= ny && ny < M &&maze[nx][ny] != '#' && d[nx][ny] == INF)            {                // 可以移动的话,将它加入队列,并且到达该位置的距离确定为到p的距离+1                que.push(P(nx,ny));                d[nx][ny] = d[p.first][p.second]+ 1;            }        }    }     return d[gx][gy];} int main(){     int res = bfs();     cout <<"Result: " << res << endl;    return 0;} 


 

       这里很神奇的用到了一个pair,pair相当于一个结构体,可以将每个点的坐标记录下来。

      bfs搜索到的结果按照bfs的过程,就是该题目的最短路径。

0 0
原创粉丝点击