迷宫的最短路径

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

是道BFS的题目。

输入:

10 10

#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#

输出:

22

#include <iostream>
#include<cstdlib>
#include<cstdio>
#include<stack>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cmath>
#include<vector>
#include<map>
#include<set>
using namespace std;


char w[110][110];

int N=0;
int M=0;
int ans=0;

int s_x,s_y;
int d_x,d_y;

int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};

int mark[110][110];

typedef pair<int,int> PA;

void bfs(){
    queue<PA> q;
    q.push(PA(s_x,s_y));
    memset(mark, -1, sizeof(mark));
    mark[s_x][s_y]=0;
    while(q.size()){
        PA p=q.front();
        q.pop();
        if(p.first==d_x&&p.second==d_y){
            return;
        }
        for(int i=0;i<4;i++){
            int x_n=p.first+dx[i];
            int y_n=p.second+dy[i];
            
            if(w[x_n][y_n]!='#'&&x_n>=0&&x_n<N&&y_n>=0&&y_n<M&&mark[x_n][y_n]==-1){
                q.push(PA(x_n,y_n));
                mark[x_n][y_n]=mark[p.first][p.second]+1;
            }
            
            
    }
    }
}

int main()
{
    scanf("%d %d",&N,&M);
    
    for(int i=0;i<N;i++){
        for(int j=0;j<M;j++){
            cin>>w[i][j];
            if(w[i][j]=='S'){
                s_x=i;
                s_y=j;
            }
            if(w[i][j]=='G'){
                d_x=i;
                d_y=j;
            }
        }
    }
    bfs();
    printf("%d\n",mark[d_x][d_y]);
    
   return 0;
}

上一篇:第五章_DML_数据操作 【load】


下一篇:春联(博弈论)