迷宫求解算法一直是算法学习的经典,实现自然也是多种多样,包括动态规划,递归等实现,这里我们使用穷举求解,加深对栈的理解和应用

定义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版)相关推荐

  1. 最小生成树Prim算法Java版

    最小生成树Prim算法Java版 算法描述: 在一个加权连通图中,顶点集合V,边集合为E 任意选出一个点作为初始顶点,标记为visit,计算所有与之相连接的点的距离,选择距离最短的,标记visit. ...

  2. Java算法:华为机试算法(下),华为算法Java版,牛客网华为算法73~108题

    接上篇:Java算法:华为机试算法(中),华为算法Java版,牛客网华为算法55~72题   HJ73 计算日期到天数转换 计算日期到天数转换 题目描述 根据输入的日期,计算是这一年的第几天.. 测试 ...

  3. java 随机金额_java_微信随机生成红包金额算法java版,最近几年玩得最疯狂的应该是 - phpStudy...

    微信随机生成红包金额算法java版 最近几年玩得最疯狂的应该是发红包了,尤其是过年的时候特别受欢迎,下面写了红包的随机算法,其实挺简单的,仅是提供一种思路,希望可以给大家一些启发. public cl ...

  4. Java算法:华为机试算法第二版(上),华为算法Java版

    牛客网华为机试练习题 文章目录 牛客网华为机试练习题 动态规划问题详解 前言 生活中的动态规划 2. 几个简单的概念 3. DP的典型应用:DAG最短路 4. 对DP原理的一点讨论 5. 例题:最长上 ...

  5. 跑胡子c语言算法,跑胡子胡牌算法Java版(带赖子、基于回溯算法)

    跑胡子规则 跑胡子,小写"一"到"十"各4张共40张,大写"壹"到"拾"各4张共40张. 砌牌:跑胡子为3人同玩,庄家砌 ...

  6. Java算法:牛客网小米笔试真题算法Java版1-40题

    题号 题目 知识点 难度 通过率 XM1 小米Git 树 困难 10.22% XM2 懂二进制 中等 29.90% XM3 风口的猪-中国牛市 动态规划 较难 18.73% XM4 电话号码分身 中等 ...

  7. 我的世界1.7.2 java_我的世界Java版1.7版本种子分享

    我的世界Java版的1.7版本中有哪些好的种子呢?下面就给大家带来我的世界Java版1.7版本种子分享,以供玩家参考. 1.seed:-6281771182477298288 x:74 y:68 z: ...

  8. 我的世界1.6.2 java_我的世界Java版1.16.2

    我的世界Java版1.16.2是一款新推出的沙盒游戏,在这个游戏中你可以看到许多新颖的玩法,同时还有许多的冒险玩法,可以让玩家感受不同的内容,同时还可以自由创造各种建筑,游戏中的各种道具可以帮助玩家更 ...

  9. HMCL支持什么java_最好用的Java版启动器HMCL

    原标题:最好用的Java版启动器HMCL 推荐的启动器是什么了?就是 Hello Minecraft! Launcher 简称HMCL,这款启动器特色很多.一张图片简单说明!!! 支持离线登录代表了什 ...

  10. 我的世界最佳java_我的世界java版20W45A快照下载_我的世界java版20W45A最新快照版官方下载 v1.19.20.106651-菜鸟下载...

    我的世界java版20W45A快照是一款最新作的快照类游戏,在这里能够得到意想不到的惊喜发现,展现出我们的智慧,接受更多困难的任务,大量的最新玩法,也是相当的特殊,保证最佳的状态,才能获得有作用的道具 ...

最新文章

  1. 阿里跳槽拼多多,80万年薪涨到160万,值不值得去?
  2. PIL:python图像处理库的介绍
  3. 汇编试验六:实践课程中的程序
  4. python测试开发django-35.xadmin注册表信息
  5. matlab usb cam,Matlab环境下使用USB2.0摄像头编程image acquisition tools(读书笔记) | 学步园...
  6. linux qt计算器,QT 计算器小程序
  7. 一个简单企业信息网站架构
  8. 自然语言处理入门新手上路
  9. 第五章:项目范围管理 - (5.4 创建 WBS )
  10. 读什么,让你的生活既有诗又有远方
  11. 51单片机电机测速程序c语言,基于51单片机光电编码器测速.doc
  12. 校验集装箱号合法性-php版
  13. 人的感性和理性做出的决断往往不一致,为什么
  14. DTV_SI 汇总 兼谈LCN
  15. adb一打开就闪退_常用的adb命令
  16. HIT 深入理解计算机系统 大作业 程序人生-Hello’s P2P
  17. 微信注册筛选软件 微信开通筛选技术
  18. 【白兔兔】用TiKZ画2017高考全国3卷理科数学流程图
  19. c语言按给定成绩查询,C语言学生成绩管理系统(简易版)
  20. 各种门平面图画法_门表图怎么画?4步就搞定!

热门文章

  1. 在View页面,使用@if(){ }输出判断正确的内容
  2. IDC服务器共享带宽和独享带宽的区别
  3. 【自然框架】——重开在线演示
  4. 朋友们PR又快要更新了,我们该做准备了
  5. 提示cannot instantiate abstract class due to following members?
  6. BootLoader学习笔记(1)
  7. 求最近点对算法分析 closest pair algorithm
  8. JAVA编程中的类和对象
  9. linux 与window 相互共享命令
  10. MySQL 表和列的注释的添加以及查看