之前在学校的积分练习上,做到一道典型的bfs,可以说是 抓牛问题 的升级版
题目如下:
Description
你突然不小心困在迷宫里面了。作为一个五一还在勤奋刷题的ACMer,这个问题简直太简单了。事不迟疑,赶紧写代码吧!
Input
多组数据 每组数据以两个正整数开头,分别代表迷宫的长和宽 接下来是n行,每行m个字符,代表迷宫的地图。 n < 100 , m < 100
其中 ‘M’ 代表你的位置, ‘E’ 代表出口 ‘1’ 代表墙,‘0’代表可走的路 你只能 上下左右 移动。Output
每组数据输出一个整数,表示你走出迷宫的最短步数。
Sample Input
2 2
S0 1ESample Output
2
大概思路很简单,还是求出最短路长度就行。
closed表用二维数组存深度
open表用 pair 类型的 queue
愉快BFS
懒得测试,大意如下:(没检查过,当成伪代码吧)
#include <cstdio>
#include <queue>
#include <utility>
using namespace std;
const int INF = 100000000;
typedef pair<int,int> P;
char maze[105][105];
int m,n;
int sx,sy;
int gx,gy;
int d[105][105];//depth
int dx[4] = {1,0,-1,0}, dy[4] = {0,1,0,-1};//move
//(sx,sy) to (gx,gy) shortest --INF
int bfs()
{
queue<P> que;
//init all to INF
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)d[i][j] = INF;
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], ny = p.second + dy[i];
if(0 <= nx && nx < n && 0 <= ny && ny < m && maze[nx][ny]!= '#' &&
d[nx][ny] == INF){ //movable
que.push(P(nx,ny));
d[nx][ny] = d[p.first][p.second] + 1;
}
}
}
return d[gx][gy];
}
int main()
{
scanf("%d%d",&m,&n);
getchar();
//get maze
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%c",&maze[i][j]);
}
getchar();
}
int res = bfs();
printf("%d\n",res);
return 0;
}
————觉得不加有点空—————