广度搜索-bfs

今天我们整一个俄罗斯的广度搜索题,帮助大家理一理写广度搜索题的思路

描述

给你一个n行m列的二维迷宫。'S'表示起点,'T'表示终点,'#'表示墙壁,'.'表示平地。你需要从'S'出发走到'T',每次只能上下左右走动,并且不能走出地图的范围以及不能走到墙壁上。请你计算出走到终点需要走的最少步数。

输入

第一行输入n,m表示迷宫大小。(1≤n,m≤100)

接下来输入n行字符串表示迷宫,每个字符串长度为m。(地图保证有且仅有一个终点,一个起始点)

输出

输出走到终点的最少步数,如果不能走到终点输出−1,占一行。

话不多说上代码

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

/*
* bfs例题:走迷宫  一个n*m大小的迷宫,S代表起点,T代表终点,#代表墙壁,。表示平地
* 求出起点到终点的最短路径
*/
class Main {
public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    //表示迷宫的大小
    int n = input.nextInt();
    int m = input.nextInt();
    boolean flag = false;
    input.nextLine();
    //mg用于描述迷宫图像
    char [][] mg = new char [n][m];
    //用于描述人的走动方向
    int [][] r = new int [][] {{0,1},{0,-1},{1,0},{-1,0}};    
    //dfs所用队列
    Queue<Point> q = new LinkedList<Point>();
    //记录图像中的某个点是否被走过
    int [][] vis = new int [n][m];
    //初始地点和终点,p3:当前点,p4:当前点的下一个点
    Point p1 = null,p2 = null , p3 = null , p4 = null;
    //载入迷宫的图像
    for(int i = 0;i < n ;i++) {
        mg[i] = input.nextLine().toCharArray();
    }
    //找到初始地点和终点
    for(int i = 0;i < n ;i++) {
        for(int j =0;j < m ;j++) {
            if(mg[i][j]=='S') {
                p1 = new Point(i,j);
            }else if(mg[i][j]=='T') {
                p2 = new Point(i,j);
            }
        }
    }
    //初始化队列
    q.add(p1);
    vis[p1.x][p1.y] = 0;
    while(!q.isEmpty()) {
        //p3表示当前走到的地方
        p3 = q.remove();

        for(int i = 0 ;i < 4 ;i++) {
            p4 = new Point(p3.x + r[i][0] , p3.y + r[i][1]);
            if(p4.x>=0 && p4.x < n && p4.y >=0 && p4.y <m
            && vis[p4.x][p4.y]==0 && mg[p4.x][p4.y]!='#' ) {
                q.add(p4);
                vis[p4.x][p4.y] = vis [p3.x][p3.y] + 1;
            }
        }
        if (p3.x == p2.x && p3.y == p2.y) {
            flag = true;
            break;
        }
   }
    if(flag) {
        System.out.println(vis[p3.x][p4.y]);
    }else {
        System.out.println(-1);
    }
  }
}
class Point{
int x,y;
public Point(int x,int y){
this.x = x;
this.y = y;
}
public Point() {}
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值