BFS相关内容笔记
Poj 6264:走出迷宫
题目链接
当你站在一个迷宫里的时候,往往会被错综复杂的道路弄得失去方向感,如果你能得到迷宫地图,事情就会变得非常简单。
假设你已经得到了一个n*m的迷宫的图纸,请你找出从起点到出口的最短路。
输入
第一行是两个整数n和m(1<=n,m<=100),表示迷宫的行数和列数。
接下来n行,每行一个长为m的字符串,表示整个迷宫的布局。字符’.‘表示空地,’#'表示墙,'S’表示起点,'T’表示出口。
输出
输出从起点到出口最少需要走的步数。
样例输入
3 3
S#T
.#.
样例输出
6
这是求解最少步数问题,从a点到b点。在迷宫中有可走与不可走。一般BFS问题,用队列可以解决,这次也不例外。定义结构时应该在结构体中加入记录步数num。
#include <bits/stdc++.h>
using namespace std;
//BFS是广度优先搜索,队列,求解最短路径问题
//例题为走迷宫
int n,m;//迷宫大小;
bool room[101][101];//地图的最大容量
int dix[]={0,0,1,-1};int diy[]={1,-1,0,0};//这是bfs关键内容,是遍历所有位置的关键
int wx,wy;//记录终点位置与最少要走的步数
#define CHECK(x,y)(x<m&&x>=0&&y>=0&&y<n)//这是判断想x y是否符合条件的判断语句
struct node//定义结构体来解决bfs,但这种定义方式是为了与判断语句符合
{
int x,y,num;//注意:这种定义方式
};
void BFS(int dx,int dy)//传入的是起点
{
int num=1;//初始化num,因为起点要算一步
queue<node>q;//定义一种类型为队列的q
node start,next;//用来记录前后的内容
start.x=dx;
start.y=dy;
start.num=num;//用这种方法记录步数
q.push(start);
while(!q.empty())
{
start=q.front();
q.pop();
for(int i=0;i<4;i++)
{
next.x=start.x+dix[i];
next.y=start.y+diy[i];
if(CHECK(next.x,next.y)&&room[next.x][next.y])
{
next.num=start.num+1;
room[next.x][next.y]=false;
q.push(next);
if(next.x==wx&&next.y==wy)
{
cout<<next.num-1<<endl;
}
}
}
}
}
int main()
{
int hx,hy;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
memset(room,false,sizeof(room));
char c;
for(int x=0;x<n;x++)
{
for(int y=0;y<m;y++)
{
cin>>c;
if(c=='S')
{
hx=x;
hy=y;
}
else if(c=='T')
{
wx=x;
wy=y;
room[x][y]=true;
}
else if(c=='.')
{
room[x][y]=true;
}
}
}
BFS(hx,hy);
}
return 0;
}