题目:
给定一个大小为 N×M 的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。
限制条件;N, M ≤ 100
Input:
Output:
22
代码:
//
// main.cpp
// BFS(迷宫问题自己写)
//
// Created by showlo on 2018/4/13.
// Copyright © 2018年 showlo. All rights reserved.
//
#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;
typedef pair<int, int> P;
#define max_n 102
#define max_m 102
#define inf 1000000
int N,M;
char map[max_n][max_m];
int direct[max_n][max_m];
int sx,sy,gx,gy;
int ans;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int bfs(int sx,int sy,int gx,int gy)
{
int nx,ny;
queue<P> Q;
memset(direct, inf, sizeof(direct));
Q.push(P(sx,sy));
direct[sx][sy]=0;
while (Q.size()) {
P q=Q.front();
Q.pop();
if (q.first==gx&&q.second==gy)
break;
else{
for (int i=0; i<=3; i++) {
nx=q.first+dx[i];
ny=q.second+dy[i];
if (nx<0||nx>N||ny<0||ny>M||map[nx][ny]=='#'||direct[nx][ny]<inf)
continue;
else{
direct[nx][ny]=direct[q.first][q.second]+1;
Q.push(P(nx,ny));
}
}
}
}
return direct[gx][gy];
}
int main() {
scanf("%d %d",&N,&M);
for (int i=0; i<N; i++) {
scanf("%s",map[i]);
}
for (int i=0; i<N; i++) {
for (int j=0; j<M; j++) {
if(map[i][j]=='S')
{
sx=i;
sy=j;
}
if(map[i][j]=='G')
{
gx=i;
gy=j;
}
}
}
ans=bfs(sx, sy, gx, gy);
printf("%d\n",ans);
return 0;
}
体会:目前感觉bfs比dfs简单一些,只需要一个while循环不停入队出队就可以了。也可能是昨天被dfs虐的太惨了(捂脸哭