习题:走迷宫2
消息加载请求中...
您暂时没有新的消息
习题:走迷宫2
给你一个n行m列的二维迷宫。'S'表示起点,'T' 表示终点,'#' 表示墙壁,'.' 表示平地。你需要从 'S' 出发走到 'T',每次只能上下左右走动,并且不能走出地图的范围以及不能走到墙壁上。请你计算出走到终点需要走的最少步数。
输入格式
第一行输入n, m表示迷宫大小。(1≤n,m≤100)
接下来输入n行字符串表示迷宫,每个字符串长度为m。(地图保证有且仅有一个终点,一个起始点)
输出格式
输出走到终点的最少步数,如果不能走到终点输出−1,占一行。
样例输入1
2 3
S.#
..T
样例输出1
3
样例输入2
3 3
S.#
.#.
.#T
样例输出2
-1
C++ 示例代码:
struct point {
int x, y;
point(int xx, int yy) {
x = xx;
y = yy;
}
};
void bfs(int sx, int sy) { // (sx, sy) 为搜索的起点
queue<point> q;
q.push(point(sx, sy)); // 将起始点放入队列中
用vis数组标记(x, y)已经被访问过;
while(队列非空) {
取出队列元素(x, y);
for (枚举(x, y)能到达的所有格子(tx, ty)) {
if (点(tx, ty)合法,可以搜索) {
标记(tx, ty)已经被访问过;
记录走到(tx, ty)的步数 = 走到(x, y)的步数 + 1;
q.push(point(tx, ty))
}
}
}
return;
}
#include <stdio.h>
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
char map[101][101];//地图大小
bool vis[101][101]; //用于标注
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int n,m,r,flag=0;
struct point//定义结构体存放坐标和步数
{
int x,y,num;
point(int xx,int yy,int dd)
{
x=xx;
y=yy;
num=dd;
}
};
void bfs(int sx,int sy)//起始位
{
queue<point> q;
q.push(point(sx,sy,0));//入队
vis[sx][sy]=true;
while(!q.empty())
{
point p=q.front();
q.pop();
if(map[p.x][p.y]=='T')//终点退出
{
r=p.num;
flag=1;
break;
}
for(int i=0;i<4;i++)
{
int tx=p.x+dx[i];
int ty=p.y+dy[i];
if(tx<n&&tx>=0&&ty<m&&ty>=0&&map[tx][ty]!='#'&&vis[tx][ty]==false)
{//符合条件的判断
q.push(point(tx,ty,p.num+1));
vis[tx][ty]=true;//已被访问
}
}
}
return;
}
int main()
{
memset(vis,false,sizeof(vis));//填充数组
int x,y;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>map[i];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(map[i][j]=='S')
{
x=i;
y=j;
}
}
bfs(x,y);
if(flag==0)
cout<<"-1";
else
cout<<r;
return 0;
}