走迷宫
题目描述
给出一个n*m的迷宫,用小写字母s表示起点,小写字母t表示终点,用#表示墙,用.表示通道。要求你从s出发,每次能向上下左右移动1步,且不能移动到有墙的格子,问从s出发,最少需要多少步才能到达终点t。
输入
第一行两个整数n,m(n<=500,m<=500),表示地图的大小 接下来有n行,每行有m个字符,这些字符只包含s,t,.,#,意义如上描述
输出
一行,表示从s走到t的最小步数。如果从s出发不能到达t,则输出-1
样例输入
3 5
…##
.#s…
#.#.t
样例输出
3
本题是一道搜索题,我一开始使用了深搜,但是超时了
#include<iostream>
#include<cmath>
#define rg register
using namespace std;
int fx[4]={1,-1,0,0};
int fy[4]={0,0,-1,1};
int n,m,ma=10000000;
int qx,qy,zx,zy;
char a[5001][5001];
bool bz[5001][5001]={false};
int ans=0;
int print(int an)
{
ma=min(an,ma);
}
int go(int x,int y)
{
if(x==zx&&y==zy)
print(ans);
else{
int xx,yy;
for(rg int i=0;i<4;i++)
{
xx=x+fx[i];
yy=y+fy[i];
if(xx<=n&&yy<=m&&xx>=1&&yy>=1&&a[xx][yy]!='#'&&bz[xx][yy]==false)
{
ans++;
bz[xx][yy]=true;
go(xx,yy);
bz[xx][yy]=false;
ans--;
}
}
}
}
int main()
{
cin>>n>>m;
for(rg int i=1;i<=n;i++)
for(rg int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='s'){
qx=i;
qy=j;
}
if(a[i][j]=='t'){
zx=i;
zy=j;
}
}
go(qx,qy);
if(ma!=10000000)
cout<<ma;
else cout<<"-1";
}
后来我想了想,就用了宽搜,上下左右四个方向,不是障碍物就入队,直到终点
代码如下
#include<iostream>
#include<cmath>
#define rg register
using namespace std;
int fx[4]={1,-1,0,0};
int fy[4]={0,0,-1,1};
int n,m;
int qx,qy,zx,zy;
char a[5555][5555];
bool bz[5555][5555]={false};
int ans=0;
int print(int f){
cout<<f;
exit(0);
}
int go(int x,int y)
{
int xx,yy,head=0,tail=1,h[250001][3];
h[1][1]=x;
h[1][2]=y;
h[1][3]=0;
bz[x][y]=true;
while(head<tail)
{
head++;
for(int i=0;i<4;i++)
{
xx=h[head][1]+fx[i];
yy=h[head][2]+fy[i];
if(xx==zx&&yy==zy){
print(h[head][3]+1);
}
if(xx<=n&&yy<=m&&yy>=1&&xx>=1&&bz[xx][yy]==false&&a[xx][yy]=='.')
{
tail++;
h[tail][1]=xx;
h[tail][2]=yy;
h[tail][3]=h[head][3]+1;
bz[xx][yy]=true;
}
}
}
}
int main()
{
cin>>n>>m;
for(rg int i=1;i<=n;i++)
for(rg int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='s'){
qx=i;
qy=j;
}
if(a[i][j]=='t'){
zx=i;
zy=j;
}
}
go(qx,qy);
cout<<-1;
}
谢谢,帮忙点个赞收藏