走迷宫 路径最短

习题:走迷宫2

 

消息加载请求中...

您暂时没有新的消息

查看全部消息

习题:走迷宫2

给你一个nm列的二维迷宫。'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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值