别人博客上看到的一道题:给定一个大小为N*M的迷宫,由通道(‘.’)和墙壁(‘#’)组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置。试求出起点到终点的最小步数。(本题假定迷宫是有解的)(N,M<=100)
原地址:http://blog.csdn.net/lrgdongnan/article/details/51773728
比较基础的迷宫题,用BFS算法即可,以下自己写的代码:
写学霸的迷宫那道题时发现二维数组[i][j]和坐标(x,y)是相反的,如果迷宫不是正方形就会出错了….数组[i][j]中i应该对应坐标y,j对应坐标x,修改了一下代码重新放上来,这次应该没问题了- -。搜索函数还是应该跟主函数独立出来的,写到一起了看着好乱-_-||
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
struct mig{
int tep;
int x,y;
char s;
}mg[100][100];
int main()
{
bool f[100][100];
memset(f,0,sizeof(f));
queue<mig> myq;
mig tt,cc;
int n,m,i,j,suf; //suf走出迷宫成功标记
cin>>n>>m;
for(i=0;i<n;i++)
for(j=0;j<m;j++){
cin>>mg[i][j].s;
mg[i][j].y=i;
mg[i][j].x=j; //注意二维数组的[i][j]与坐标(x,y)相反
if(mg[i][j].s=='S') { mg[i][j].tep=0; f[i][j]=1; myq.push(mg[i][j]);}
if(mg[i][j].s=='#') f[i][j]=1;
}
while(!myq.empty())
{
tt=myq.front();
myq.pop();
i=tt.y;
j=tt.x;
if(i+1<n && f[i+1][j]==0) {
if(mg[i+1][j].s=='G'){suf=1; break;} //向下
f[i+1][j]=1;
cc.y=i+1;
cc.x=j;
cc.tep=tt.tep+1;
myq.push(cc);
}
if(i-1>=0 && f[i-1][j]==0) {
if(mg[i-1][j].s=='G'){suf=1; break;} //向上
f[i-1][j]=1;
cc.y=i-1;
cc.x=j;
cc.tep=tt.tep+1;
myq.push(cc);
}
if(j+1<m && f[i][j+1]==0) {
if(mg[i][j+1].s=='G'){suf=1; break;} //向右
f[i][j+1]=1;
cc.y=i;
cc.x=j+1;
cc.tep=tt.tep+1;
myq.push(cc);
}
if(j-1>=0 && f[i][j-1]==0) {
if(mg[i][j-1].s=='G'){suf=1; break;} //向左
f[i][j-1]=1;
cc.y=i;
cc.x=j-1;
cc.tep=tt.tep+1;
myq.push(cc);
}
}
if(suf==1) cout<<tt.tep+1<<endl;
else cout<<"no"<<endl;
return 0;
}