BFS实现迷宫问题

问题描述,要求从起点走到终点,找出最短的距离,要避开障碍

输入描述,输入一个二维数组表示地图,其中等于10就是终点,等于-10就是起点,等于1就是障碍,等于0就是可以走的

代码:

import java.util.LinkedList;
import java.util.Queue; /**
* @author xuziao
* @date 2021/10/17 19:40
*/ public class BFS {
public static int getShort(int[][] map){
int ans = 0;
int startX = 0;
int startY = 0;
int maxX = map.length - 1;
int maxY = map[0].length - 1; Queue<Coordinate> coordinateQueue = new LinkedList<>(); for (int x = 0; x < map.length; x++) {
for (int y = 0; y < map[0].length; y++){
if (map[x][y] == -10) {
startX = x;
startY = y;
}
}
} MovePoint movePoint = new MovePoint(map, maxX, maxY); Coordinate coordinate = new Coordinate(startX, startY, 0);
coordinateQueue.add(coordinate); while (true) {
if (coordinateQueue.isEmpty()) {
break;
}
Coordinate point = coordinateQueue.poll();
movePoint.setCoordinate(point);
Coordinate l = movePoint.left();
Coordinate b = movePoint.bottom();
Coordinate t = movePoint.top();
Coordinate r = movePoint.right();
if (l != null) {
if (isAns(l, map)) {
ans = l.step;
break;
}
coordinateQueue.add(l);
}
if (b != null) {
if (isAns(b, map)) {
ans = b.step;
break;
}
coordinateQueue.add(b);
}
if (t != null) {
if (isAns(t, map)) {
ans = t.step;
break;
}
coordinateQueue.add(t);
}
if (r != null) {
if (isAns(r, map)) {
ans = r.step;
break;
}
coordinateQueue.add(r);
}
}
return ans;
} private static boolean isAns(Coordinate coordinate, int[][] map) {
return map[coordinate.getX()][coordinate.getY()] == 10;
} public static void main(String[] args) {
//测试数据,-10代表起点,10代表终点,1代表墙
int[][] data = {{-10, 0, 0, 0}, {0, 1, 0, 1}, {0, 0, 1, 10}, {1, 0, 0, 0}};
System.out.println(isAns(new Coordinate(2, 3, 0), data));
//start:(0, 0) end(2, 3)
}
} class Coordinate {
int x;
int y;
int step = 0;
public Coordinate(int x, int y, int step) {
this.x = x;
this.y = y;
this.step = step;
} public int getX() {
return x;
}
public int getY() {
return y;
}
} class MovePoint{
Coordinate coordinate;
private final int maxX;
private final int maxY;
private final int[][] map;
MovePoint(int[][] map, int maxX, int maxY) {
this.maxY = maxY;
this.maxX = maxX;
this.map = map;
} public void setCoordinate(Coordinate coordinate) {
this.coordinate = coordinate;
} public Coordinate top() {
int x = coordinate.getX() - 1;
int y = coordinate.getY();
//判断点是否超出边界
boolean isLegal = x > maxX || x < 0 || y > maxY || y < 0 || map[x][y] == 1;
if (isLegal) {
return null;
} else {
map [x][y] = map[x][y] == 10 ? 10 : 1;
coordinate.step++;
return new Coordinate(x, y, coordinate.step);
}
} public Coordinate bottom() {
int x = coordinate.getX() + 1;
int y = coordinate.getY();
//判断点是否超出边界
boolean isLegal = x > maxX || x < 0 || y > maxY || y < 0 || map[x][y] == 1;
if (isLegal) {
return null;
} else {
map[x][y] = 1;
coordinate.step++;
return new Coordinate(x, y, coordinate.step);
}
} public Coordinate right() {
int x = coordinate.getX();
int y = coordinate.getY() + 1;
//判断点是否超出边界
boolean isLegal = x > maxX || x < 0 || y > maxY || y < 0 || map[x][y] == 1;
if (isLegal) {
return null;
} else {
map[x][y] = 1;
coordinate.step++;
return new Coordinate(x, y, coordinate.step);
}
} public Coordinate left() {
int x = coordinate.getX();
int y = coordinate.getY() - 1;
//判断点是否超出边界
boolean isLegal = x > maxX || x < 0 || y > maxY || y < 0 || map[x][y] == 1;
if (isLegal) {
return null;
} else {
map[x][y] = 1;
coordinate.step++;
return new Coordinate(x, y, coordinate.step);
}
} }

BFS实现迷宫问题的更多相关文章

  1. ACM:图BFS,迷宫

    称号: 网络格迷宫n行m单位列格组成,每个单元格无论空间(使用1表示),无论是障碍(使用0为了表示).你的任务是找到一个动作序列最短的从开始到结束,其中UDLR同比分别增长.下一个.左.向右移动到下一 ...

  2. 广度优先搜索(BFS)——迷宫的最短路径

    宽度优先搜索按照距开始状态由近到远的顺序进行搜索,因此可以很容易的用来求最短路径,最少操作之类问题的答案. 宽度优先搜索介绍(一篇不错的文章). 题目描述: 给定一个大小为N*M的迷宫.迷宫有通道和墙 ...

  3. 【bfs】迷宫问题

    [题目描述] 定义一个二维数组: int maze[5][5] = { 0,1,0,0,0, 0,1,0,1,0, 0,0,0,0,0, 0,1,1,1,0, 0,0,0,1,0, }; 它表示一个迷 ...

  4. BFS求解迷宫的最短路径问题

    题目:给定一个大小为N*M的迷宫,迷宫由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置.试求出起点到终点的最小步数.(本题假定迷宫是 ...

  5. BFS简单迷宫

    常见迷宫: 输入迷宫 启点 终点 然后求最短路径 BFS例题 用dist[][]数组来记录 启点到每个点的最短路径 #include <iostream> #include <fst ...

  6. 用BFS解决迷宫问题

    在一个n*n的矩阵里走,从原点(0,0)開始走到终点(n-1,n-1),仅仅能上下左右4个方向走.仅仅能在给定的矩阵里走,求最短步数. n*n是01矩阵,0代表该格子没有障碍.为1表示有障碍物. in ...

  7. 有关dfs、bfs解决迷宫问题的个人见解

    可以使用BFS或者DFS方法解决的迷宫问题! 题目如下: kotori在一个n*m迷宫里,迷宫的最外层被岩浆淹没,无法涉足,迷宫内有k个出口.kotori只能上下左右四个方向移动.她想知道有多少出口是 ...

  8. Escape(多记一个方向状态的BFS)迷宫逃脱

    题意:https://www.nitacm.com/problem_show.php?pid=2266 vis记[x][y][dir]三个状态就行. 引用:https://blog.csdn.net/ ...

  9. BFS(广度优先搜索)

    简介 BFS的过程是首先访问起始结点v,接着访问顶点v的所有未被访问的邻接结点,然后对每个继续进行上述步骤,直到所有结点都被访问过为止,当然,在访问过程中,需要使用一个队列,然后类似二叉树的层次遍历来 ...

随机推荐

  1. 二、Ansible基础之模块篇

    目录 1. Ansible Ad-Hoc 命令 1.1 命令格式 1.2 模块类型 1.3 联机帮助 1.3.1 常用帮助参数 1.4 常用模块 1.4.1 command & shell 模 ...

  2. Java:LinkedList类小记

    Java:LinkedList类小记 对 Java 中的 LinkedList类,做一个微不足道的小小小小记 概述 java.util.LinkedList 集合数据存储的结构是循环双向链表结构.方便 ...

  3. Beta-技术规格说明书

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-计划-功能规格说明书 一.架构与技术栈 1.整体架构 本项目的整体架构如上图所示.下面我们将对涉及 ...

  4. BUAA 软工 个人博客作业(一)

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 通过阅读<构建之法>大致了解软件工程 这个作业在哪 ...

  5. pyqgis环境配置

    配置pyqgis开发环境时,很多网上教程写的非常繁琐,这里仅仅找了一个最简单的配置方法,使用pycharm的IDE,安装QGIS软件后,在pycharm的ProjectInterpreter里面填写Q ...

  6. 计算机网络之传输层(传输层提供的服务及功能概述、端口、套接字--Socket、无连接UDP和面向连接TCP服务)

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105451022 学习课程:<2019王道考研计算机网络> 学习目的 ...

  7. 好的编程习惯是减少bug最有效的方法

    公司来了几个新手,有时候很简单的一个功能模块都要耗费好几天时间,总是在一些不相关的问题上死耗一整天,搞出莫名其妙的问题,找不到具体原因,总是怀疑编译出问题了,系统出问题了,板子出问题了,搞到快下班了叫 ...

  8. cf Two Sets (我用二分最大匹配做的)

    题意: n个数p1,p2....pn     两个数a,b 把它们分成A,B两个集合. 若x属于A,a-x一定属于A. 若x属于B,b-x一定属于B. 问是否可能将这n个数分成两个集合.若可以,输出每 ...

  9. InnoDB存储引擎的锁

    InnoDB存储引擎的锁 锁的类型 锁的类型包括: 1.     共享锁(S lock),允许事务读取一行数据 2.     排他锁(X lock),允许事务删除或更新一行数据 锁的兼容性a X S ...

  10. 『学了就忘』Linux基础命令 — 26、帮助命令

    目录 1.man命令 (1)man命令的快捷键 (2)man命令的帮助级别(了解即可) (3)man命令的使用 2.info命令 3.help命令 4.--help选项 1.man命令 man是最常见 ...