迷宫求解 java_迷宫求解算法(java版)
迷宫求解算法一直是算法学习的经典,实现自然也是多种多样,包括动态规划,递归等实现,这里我们使用穷举求解,加深对栈的理解和应用
定义Position类用于存储坐标点
起点坐标为(1,1),终点坐标为(8,8)
地图打印在最下面
class Position {
private int px;
private int py;
public Position(int px, int py) {
this.px = px;
this.py = py;
}
public int getPx() {
return px;
}
public void setPx(int px) {
this.px = px;
}
public int getPy() {
return py;
}
public void setPy(int py) {
this.py = py;
}
}
这里我们简单介绍下move()函数
move函数分别向四个方向移动,然后将可行的path入栈.
注意,这里栈元素中每个栈元素Position都是new出来的,栈中存的是reference,
注意看下面这种写法:
currentPosition.setPy(currentPosition.getPy()+1);
stacks.push(currentPosition);
这种写法一度让我陷入困惑,因为pop出来的Position都是一样的,原因大家可能应该明白了。。。
public void move() {
if (moveRight()) {
Position temp = new Position(currentPosition.getPx() + 1, currentPosition.getPy());
test.add(temp);
stacks.push(temp);
} else if (moveBottom()) {
Position temp = new Position(currentPosition.getPx(), currentPosition.getPy() + 1);
test.add(temp);
stacks.push(temp);
} else if (moveTop()) {
Position temp = new Position(currentPosition.getPx(), currentPosition.getPy() - 1);
test.add(temp);
stacks.push(temp);
} else if (moveLeft()) {
Position temp = new Position(currentPosition.getPx() - 1, currentPosition.getPy());
test.add(temp);
stacks.push(temp);
} else {
currentPosition = stacks.pop();//若当前位置四个方向都走不通,则将当前位置出栈,继续遍历上一节点
}
}
整体代码
class Position {
private int px;
private int py;
public Position(int px, int py) {
this.px = px;
this.py = py;
}
public int getPx() {
return px;
}
public void setPx(int px) {
this.px = px;
}
public int getPy() {
return py;
}
public void setPy(int py) {
this.py = py;
}
}
public class Maze {
private final Position start;//迷宫的起点final
private final Position end;//迷宫的终点final
private ArrayList footPrint;//足迹
private ArrayList test;
private MyStack stacks;//自定义栈(也可以用java.util中的Stack栈)若想了解MyStack的实现,可以参考我的另一篇博客
private Position currentPosition;//定义当前位置
public Maze() {//集合,栈的初始化工作
start = new Position(1, 1);
end = new Position(8, 8);
currentPosition = start;
stacks = new MyStack<>();
test = new ArrayList<>();
}
public static final int map[][] = //定义地图10*10的方格
{{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{1, 0, 0, 1, 0, 0, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 1, 1, 0, 0, 1},
{1, 0, 1, 1, 1, 0, 0, 0, 0, 1},
{1, 0, 0, 0, 1, 0, 0, 0, 0, 1},
{1, 0, 1, 0, 0, 0, 1, 0, 0, 1},
{1, 0, 1, 1, 1, 0, 1, 1, 0, 1},
{1, 1, 0, 0, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}};
public static void printMap() {//打印地图
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (map[i][j] == 1) System.out.print(" ■");
else System.out.print(" ");
}
System.out.println();
}
}
public boolean moveTop() {//上移
String s = currentPosition.getPx() + "" + (currentPosition.getPy() - 1);
if ((map[currentPosition.getPx()][currentPosition.getPy() - 1] != 1) & !isArrived(s)) {
footPrint.add(s);
return true;
}
return false;
}
public boolean moveRight() {//右移
String s = (currentPosition.getPx() + 1) + "" + currentPosition.getPy();
if (map[currentPosition.getPx() + 1][currentPosition.getPy()] != 1 & !isArrived(s)) {
footPrint.add(s);
return true;
}
return false;
}
public boolean moveBottom() {//下移
String s = currentPosition.getPx() + "" + (currentPosition.getPy() + 1);
if ((map[currentPosition.getPx()][currentPosition.getPy() + 1] != 1) & !isArrived(s)) {
footPrint.add(s);
return true;
}
return false;
}
public boolean moveLeft() {//左移
String s = (currentPosition.getPx() - 1) + "" + currentPosition.getPy();
if ((map[currentPosition.getPx() - 1][currentPosition.getPy()] != 1) & !isArrived(s)) {
footPrint.add(s);
return true;
}
return false;
}
public boolean isArrived(String position) {//判断当前位置是否已经到打过
return footPrint.contains(position);
}
public void move() {//move函数分别向四个方向移动,然后将可行的path入栈
if (moveRight()) {
Position temp = new Position(currentPosition.getPx() + 1, currentPosition.getPy());
test.add(temp);
stacks.push(temp);
} else if (moveBottom()) {
Position temp = new Position(currentPosition.getPx(), currentPosition.getPy() + 1);
test.add(temp);
stacks.push(temp);
} else if (moveTop()) {
Position temp = new Position(currentPosition.getPx(), currentPosition.getPy() - 1);
test.add(temp);
stacks.push(temp);
} else if (moveLeft()) {
Position temp = new Position(currentPosition.getPx() - 1, currentPosition.getPy());
test.add(temp);
stacks.push(temp);
} else {
currentPosition = stacks.pop();//若当前位置四个方向都走不通,则将当前位置出栈,继续遍历上一节点
}
}
public static void main(String[] args) {
Maze m = new Maze();
m.footPrint = new ArrayList<>();
m.footPrint.add("11");
m.stacks.push(m.start);
while (m.currentPosition.getPx() != 8 || m.currentPosition.getPy() != 8) {
m.move();
}
printMap();
System.out.println("下面是足迹,长度是:" + m.footPrint.size());
m.printFootPrint();
}
public void printFootPrint() {
for (int i = 0; i < footPrint.size(); i++) {
System.out.print(footPrint.get(i) + ",");
}
System.out.println();
}
}
大家可能会疑惑,为什么足迹是不连续的(例如:21,12)两个位置是走不通的,是因为在path遍历过程中存在跳栈,既当前位置走不通便会将当前位置的Position出栈(stacks.pop),然后继续上一节点遍历。
更多关于java的文章请戳这里:(您的留言意见是对我最大的支持)
Email:sxh13208803520@gmail.com
迷宫求解 java_迷宫求解算法(java版)相关推荐
- 最小生成树Prim算法Java版
最小生成树Prim算法Java版 算法描述: 在一个加权连通图中,顶点集合V,边集合为E 任意选出一个点作为初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的,标记visit. ...
- Java算法:华为机试算法(下),华为算法Java版,牛客网华为算法73~108题
接上篇:Java算法:华为机试算法(中),华为算法Java版,牛客网华为算法55~72题 HJ73 计算日期到天数转换 计算日期到天数转换 题目描述 根据输入的日期,计算是这一年的第几天.. 测试 ...
- java 随机金额_java_微信随机生成红包金额算法java版,最近几年玩得最疯狂的应该是 - phpStudy...
微信随机生成红包金额算法java版 最近几年玩得最疯狂的应该是发红包了,尤其是过年的时候特别受欢迎,下面写了红包的随机算法,其实挺简单的,仅是提供一种思路,希望可以给大家一些启发. public cl ...
- Java算法:华为机试算法第二版(上),华为算法Java版
牛客网华为机试练习题 文章目录 牛客网华为机试练习题 动态规划问题详解 前言 生活中的动态规划 2. 几个简单的概念 3. DP的典型应用:DAG最短路 4. 对DP原理的一点讨论 5. 例题:最长上 ...
- 跑胡子c语言算法,跑胡子胡牌算法Java版(带赖子、基于回溯算法)
跑胡子规则 跑胡子,小写"一"到"十"各4张共40张,大写"壹"到"拾"各4张共40张. 砌牌:跑胡子为3人同玩,庄家砌 ...
- Java算法:牛客网小米笔试真题算法Java版1-40题
题号 题目 知识点 难度 通过率 XM1 小米Git 树 困难 10.22% XM2 懂二进制 中等 29.90% XM3 风口的猪-中国牛市 动态规划 较难 18.73% XM4 电话号码分身 中等 ...
- 我的世界1.7.2 java_我的世界Java版1.7版本种子分享
我的世界Java版的1.7版本中有哪些好的种子呢?下面就给大家带来我的世界Java版1.7版本种子分享,以供玩家参考. 1.seed:-6281771182477298288 x:74 y:68 z: ...
- 我的世界1.6.2 java_我的世界Java版1.16.2
我的世界Java版1.16.2是一款新推出的沙盒游戏,在这个游戏中你可以看到许多新颖的玩法,同时还有许多的冒险玩法,可以让玩家感受不同的内容,同时还可以自由创造各种建筑,游戏中的各种道具可以帮助玩家更 ...
- HMCL支持什么java_最好用的Java版启动器HMCL
原标题:最好用的Java版启动器HMCL 推荐的启动器是什么了?就是 Hello Minecraft! Launcher 简称HMCL,这款启动器特色很多.一张图片简单说明!!! 支持离线登录代表了什 ...
- 我的世界最佳java_我的世界java版20W45A快照下载_我的世界java版20W45A最新快照版官方下载 v1.19.20.106651-菜鸟下载...
我的世界java版20W45A快照是一款最新作的快照类游戏,在这里能够得到意想不到的惊喜发现,展现出我们的智慧,接受更多困难的任务,大量的最新玩法,也是相当的特殊,保证最佳的状态,才能获得有作用的道具 ...
最新文章
- 阿里跳槽拼多多,80万年薪涨到160万,值不值得去?
- PIL:python图像处理库的介绍
- 汇编试验六:实践课程中的程序
- python测试开发django-35.xadmin注册表信息
- matlab usb cam,Matlab环境下使用USB2.0摄像头编程image acquisition tools(读书笔记) | 学步园...
- linux qt计算器,QT 计算器小程序
- 一个简单企业信息网站架构
- 自然语言处理入门新手上路
- 第五章:项目范围管理 - (5.4 创建 WBS )
- 读什么,让你的生活既有诗又有远方
- 51单片机电机测速程序c语言,基于51单片机光电编码器测速.doc
- 校验集装箱号合法性-php版
- 人的感性和理性做出的决断往往不一致,为什么
- DTV_SI 汇总 兼谈LCN
- adb一打开就闪退_常用的adb命令
- HIT 深入理解计算机系统 大作业 程序人生-Hello’s P2P
- 微信注册筛选软件 微信开通筛选技术
- 【白兔兔】用TiKZ画2017高考全国3卷理科数学流程图
- c语言按给定成绩查询,C语言学生成绩管理系统(简易版)
- 各种门平面图画法_门表图怎么画?4步就搞定!