java解决迷宫问题bfs_BFS入门,Java迷宫问题
这其实是BFS的入门级问题,我以初学者的姿态研究,如有不足请指正。
BFS的核心是利用query的先进先出原则,而本题的回溯用到了stack的后进先出原则,可以说是对两种数据结构的复习。
在解题过程中对Java的对象复制的本质有了更加深刻的理解,具体发在另一篇博文”Java对象复制的背后“
本题是基本的BFS原理,附加利用二维数组构造象限,利用二维boolean数组构造visited,和利用二维dir数组构建上下左右的移动。
以下是代码
这里的queue是存放每层点的数据结构。(从上一层前往下一层),有且它只保存一层的数据。这也符合BFS的特质。
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
public class solution {
public static int M = 5;
public static int N = 5;
public static void main(String args[]) {
int maze[][] = { { 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 } };
if (maze_path(maze))
System.out.println("The solution is showed above");
else
System.out.println("It is not feasible");
}
public static boolean maze_path(int MAZE[][]) {
int maze[][] = MAZE;
boolean visited[][] = new boolean[5][5];
Queue queue = new LinkedList();
Stack path = new Stack();
Node start = new Node(0, 0);
visited[0][0] = true;
Node end = new Node(4, 4);
Node cur = new Node(0, 0, 0, 0);
Node move = new Node(0, 0, 0, 0);
int dir[][] = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };
queue.offer(start);
while (!queue.isEmpty()) {
cur = queue.poll();
path.push(cur);
for (int i = 0; i < 4; i++) {
move.x = cur.x + dir[i][0];
move.y = cur.y + dir[i][1];
move.prev_x = cur.x;
move.prev_y = cur.y;
if (move.x == end.x && move.y == end.y) {
while (!path.isEmpty()) {
Node show_path = path.pop();
if (move.prev_x == show_path.x && move.prev_y == show_path.y) {
System.out.println("(" + show_path.x + ", " + show_path.y + ")");
move = show_path;
}
}
return true;
}
if (move.x >= 0 && move.x < M && move.y >= 0 && move.y < N && (maze[move.x][move.y] == 0)
&& (!visited[move.x][move.y])) {
Node new_node = new Node(move.x, move.y, move.prev_x, move.prev_y);
queue.offer(new_node);
visited[move.x][move.y] = true;
}
}
}
return false;
}
}
以下是Node类
public class Node {
public int x;
public int y;
public int prev_x;
public int prev_y;
boolean value;
public Node(int X, int Y, int PREV_X, int PREV_Y) {
this.x = X;
this.y = Y;
this.prev_x = PREV_X;
this.prev_y = PREV_Y;
}
public Node(int X, int Y) {
this.x = X;
this.y = Y;
}
}
值得注意的是,为了回溯的需要,在node中还添加了prev_x和prev_y
在解题过程中我在思路上遇到过两个瓶颈
1. 最初我认为BFS的算法不能解决这个迷宫问题,当时的想法是:比如总有一个点是一条岔路,然后有一条看似能走通的路和一条不能走通的路,如果通过标记点的方式,可能在不能走通的路上把能走通的点标为了false,于是都走不通了。其实这个想法仔细想想就不可能,因为如果那条所谓不能走通的路上存在一个能够让另一条路走通的点,那么它本身就肯定是能够走通的。现在看起来很容易的point,当时确实困扰了我很久。
2. 在回溯时,利用
while (!path.isEmpty()) {
Node show_path = path.pop();
if (move.prev_x == show_path.x && move.prev_y == show_path.y) {
System.out.println("(" + show_path.x + ", " + show_path.y + ")");
move = show_path;
}
}
这段代码可以完成回溯,通过stack的先进后出原则,通过回溯到上一个节点的prev则能够继续找到更上一个的,进而完成全部回溯。
java解决迷宫问题bfs_BFS入门,Java迷宫问题相关推荐
- 好程序员Java培训分享如何快速入门Java编程
好程序员Java培训分享如何快速入门Java编程,作为老牌编程语言,Java拥有广阔的市场应用,企业对Java人才的需求一直居高不下.有很多非专业.零基础的人想要学习Java却不知道怎么快速入门,接下 ...
- Java中的字符集编码入门Java中的增补字符
转载自:http://jiangzhengjun.iteye.com/blog/512083 Java中的字符集编码入门Java中的增补字符 博客分类: 字符集编码 Java Java号称对Unico ...
- swift golang java,解决两数之和 (Javascript, Java, C#, Swift, Kotlin, Python,C++, Golang)
解决两数之和(Javascript, Java, C#, Swift, Kotlin, Python,C++, Golang) 给定一个整数数组,返回两个数字的索引,以便它们加起来成为一个特定的目标. ...
- java解决错误经验_在Java错误进入生产之前的新处理方式
java解决错误经验 我们如何认识到解决预生产错误的旧方法还不够,以及我们如何能够改变它 第一次尝试就没有完美的代码,我们所有人都可以证明我们已经通过艰苦的努力学习了. 不管我们使用多少测试周期,代码 ...
- java freemarker 分页_10小时入门java开发04 springboot+freemarker+bootstrap快速实现分页功能...
本节是建立在上节的基础上,上一节给大家讲了管理后台表格如何展示数据,但是当我们的数据比较多的时候我们就需要做分页处理了.这一节给大家讲解如何实现表格数据的分页显示. 准备工作 还是老规矩,看效果图 可 ...
- java解决策略膨胀_折腾Java设计模式之策略模式
简介 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改.这种类型的设计模式属于行为型模式.简单理解就是一组算法,可以互换,再简单点策略就是封装算法. 意图 定义一 ...
- Java解决空引用_在java中检查空引用的乐观方法
本问题已经有最佳答案,请猛点这里访问. 任何Java精通/专家都能告诉我,在使用null来避免EDCOX1×0时,检查空引用或对象的乐观方式是什么? 在我的代码中,我有100多个字段,其中大部分是为了 ...
- 杭州博圣生物java开发_十天入门java教程 Day02
1,常量,变量的理解 常量,程序运行过程中,不能改变的,叫常量. 变量,程序运行过程中,改变的,叫变量. 2,变量的理解 变量,用来存储数据的,数据类型,存放哪种数据的种类. 变量的概念:程序运行期间 ...
- java编程启蒙_程序设计入门—Java语言
第一周:做点计算 1.1 第一个程序 如何下载.安装Eclipse和JRE,并且简单介绍一下这个软件的几个主要部分:如何在Eclipse中编辑.编译和运行程序:详解第一个程序:程序框架.输出.出错怎么 ...
最新文章
- oracle11 区分大小写,修改Oracle11g用户密码不区分大小写
- POJ3268 Silver Cow Party(最短路径)
- 收留我接入云信,打造陌生人旅行社交
- checkbox checked属性值
- scrapy中使用css选择器罗列下一级的所有标签
- vs运行html没有注册类,解决win10运行com提示“错误代码 80040154-没有注册类”的方法...
- 树莓派安装rtl8192eu无线网卡驱动
- Linux下的tar命令
- 在centos7环境下运行.exe文件
- 论文 查重 知网 万方 paperpass
- excel输出线性拟合曲线的斜率
- 电脑通信端口带感叹号,如何解决网络适配器里黄色感叹号
- python概率编程_TensorFlow新功能:TensorFlow Probability概率编程工具箱介绍
- Ubuntu操作系统漏洞扫描和分析
- matplotlib作图系列之内置颜色使用(一)
- win7如何解除锁定计算机,Win7电脑键盘数字键被锁了怎么解锁(图文)
- 英语作文写作常用句型
- 硒鼓带不带芯片区别_为什么有些打印机墨盒原本并无芯片,而灌注墨粉后则需要加装芯片才能使用?...
- 校招准备:(七):数据库2数据库架构与事务以及其他问题
- [课业] 09 | 软工 | 软件工程的发展
热门文章
- 重庆计算机大专排名,2021重庆五大专科学校排行
- BaseServlet的抽取:java.lang.NoSuchMethodException: cn.itcast.travel.web.servlet.UserServlet.add(javax.s
- 满分答卷 2022年“研究生科研素养提升”系列公益讲座在线测评
- python玩王者荣耀皮肤_python 抓取王者荣耀皮肤 代码2年了 依旧可以抓取高清 王者皮肤...
- STM32F1常用外设介绍(超详细35000字介绍)
- 喜报,实力认可! | 通付盾上榜《ISC 2022数字安全创新能力全景图谱》七大安全领域
- 《炬丰科技-半导体工艺》 300mm 硅上的单片 InGaAs 光电探测器
- table支持键盘上下左右控制
- LocalStorage在Chrome里的实现
- redis防止表单重复提交