使用栈的迷宫算法java版代码
作者:young_leez 发布时间:2022-03-07 12:47:16
标签:java,迷宫算法
本文为大家分享了使用栈的迷宫算法java版,主要考察栈的使用,供大家参考,具体内容如下
主要思路如下:
do {
if(当前位置可通过) {
标记此位置已走过;
保存当前位置并入栈;
if(当前位置为终点) {
程序结束;
}
获取下一个位置;
}
else {
if(栈非空) {
出栈;
while(当前位置方向为4且栈非空) {
标记当前位置不可走;
出栈;
}
if(当前位置的方向小于4) {
方向+1;
重新入栈;
获取下一个位置;
}
}
}
}
while (栈非空);
java代码如下:
import java.util.Stack;
public class Maze {
// 栈
private Stack<MazeNode> stack = new Stack<Maze.MazeNode>();
// 迷宫
private int[][] maze = {
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1},
{1,0,0,0,0,1,1,0,1,1,1,0,0,1,1,1,1},
{1,0,1,1,0,0,0,0,1,1,1,1,0,0,1,1,1},
{1,1,1,0,0,1,1,1,1,1,1,0,1,1,0,0,1},
{1,1,0,0,1,0,0,1,0,1,1,1,1,1,1,1,1},
{1,0,0,1,1,1,1,1,1,0,1,0,0,1,0,1,1},
{1,0,0,1,1,1,1,1,1,0,1,0,0,1,0,1,1},
{1,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1},
{1,0,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1},
{1,1,0,0,0,0,1,1,0,1,0,0,0,0,0,0,1},
{1,1,0,1,1,1,1,1,0,0,0,1,1,1,1,0,1},
{1,0,0,0,0,1,1,1,1,1,0,1,1,1,1,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
};
// 标记路径是否已走过
private int[][] mark = new int[MAZE_SIZE_X][MAZE_SIZE_Y];
private static final int MAZE_SIZE_X = 14;
private static final int MAZE_SIZE_Y = 17;
private static final int END_X = 12;
private static final int END_Y = 15;
private void initMark() {
for (int i = 0; i < MAZE_SIZE_X; i++) {
for (int j = 0; j < MAZE_SIZE_Y; j++) {
mark[i][j] = 0;
}
}
}
public void process() {
initMark();
Position curPos = new Position(1, 1);
do {
// 此路径可走
if (maze[curPos.x][curPos.y] == 0 && mark[curPos.x][curPos.y] == 0) {
mark[curPos.x][curPos.y] = 1;
stack.push(new MazeNode(curPos, 1));
// 已到终点
if (curPos.x == END_X && curPos.y == END_Y) {
return;
}
curPos = nextPos(curPos, stack.peek().direction);
}
// 走不通
else {
if (!stack.isEmpty()) {
MazeNode curNode = stack.pop();
while (curNode.direction == 4 && !stack.isEmpty()) {
// 如果当前位置的4个方向都已试过,那么标记该位置不可走,并出栈
mark[curNode.position.x][curNode.position.y] = 1;
curNode = stack.pop();
}
if (curNode.direction < 4) {
curNode.direction++;// 方向+1
stack.push(curNode);// 重新入栈
curPos = nextPos(curNode.position, curNode.direction);// 获取下一个位置
}
}
}
}
while(!stack.isEmpty());
}
public void drawMaze() {
for (int i = 0; i < maze.length; i++) {
for (int j = 0; j < maze[0].length; j++) {
System.out.print(maze[i][j]);
}
System.out.print("\n");
}
System.out.print("\n");
}
public void drawResult() {
initMark();
MazeNode node;
while (!stack.isEmpty()) {
node = stack.pop();
mark[node.position.x][node.position.y] = 1;
}
for (int i = 0; i < mark.length; i++) {
for (int j = 0; j < mark[0].length; j++) {
System.out.print(mark[i][j]);
}
System.out.print("\n");
}
System.out.print("\n");
}
// 记录迷宫中的点的位置
class Position {
int x;
int y;
public Position(int x, int y) {
this.x = x;
this.y = y;
}
}
// 栈中的结点
class MazeNode {
Position position;
int direction;
public MazeNode(Position pos) {
this.position = pos;
}
public MazeNode(Position pos, int dir) {
this.position = pos;
this.direction = dir;
}
}
// 下一个位置,从右开始,顺时针
public Position nextPos(Position position, int direction) {
Position newPosition = new Position(position.x, position.y);
switch (direction) {
case 1:
newPosition.y += 1;
break;
case 2:
newPosition.x += 1;
break;
case 3:
newPosition.y -= 1;
break;
case 4:
newPosition.x -= 1;
break;
default:
break;
}
return newPosition;
}
public static void main(String[] args) {
Maze maze = new Maze();
maze.drawMaze();
maze.process();
maze.drawResult();
}
}
来源:http://blog.csdn.net/Young_Leez/article/details/44026295


猜你喜欢
- 数据库里面表的字段中带有“”_“下划线,我们知道插件默认的是将这些带有下划线的字段默认的变成“优美的驼峰式”的。表是肯定不能动的,实体类的字
- 枚举中有values方法用于按照枚举定义的顺序生成一个数组,可以用来历遍。我们自定义的枚举类都是继承自java.lang.Enum,拥有一下
- 目录1.C 语言包含的数据类型2.C语言的基本数据类型3.示例代码1.C 语言包含的数据类型如下图所示:2.C语言的基本数据类型short、
- 本文实例讲述了C#预处理器指令的用法。分享给大家供大家参考。具体用法分析如下:C#预处理器指令是在编译时调用的。预处理器指令(preproc
- Chart折线图使用鼠标滚轮放大、缩小和平移曲线使用鼠标滚轮滚动放大和缩小X轴的宽度,鼠标左键按住拖动实现曲线的左右平移,不再使用滚动条。添
- 生成文字图片:/// <summary> /// 生成文字图片 /// &l
- 为什么要使用Lambda?可以对一个接口进行非常简洁的实现。Lambda对接口的要求?接口中定义的抽象方法有且只有一个才可以。传统实现一个接
- 本文介绍了ListView给每个Item上面的按钮添加事件,具体如下:1.先看下效果图:在这里仅供测试,我把数据都写死了,根据需要可以自己进
- 1.launch启动流程已知协程的启动方式之一是Globalscope.launch,那么Globalscope.launch的流程是怎样的
- Spring Boot项目默认的会打包成单一的jar文件,但是有时候我们并不想让配置文件、依赖包都跟可执行文件打包到一起。这时候可以在pom
- 1.定义字符串字符串常见的构造方式如下:String s1 = "with";String s2 = new Strin
- 前言我们在使用spring security的时候可以通过好几种方法获取用户信息, 但是今天这篇文章介绍的是一个笔者觉得最优雅的实现; 借鉴
- 在Android中通过ListView显示SD卡中的文件列表一共有两种方法,一是:通过继承ListActivity显示;二是:利用BaseA
- 1.值类型值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型。值类型的变量直接存储数据,分配在托管栈中。变量会在创建
- 1、pom.xml文件添加distributionManagement节点。模块项目中如果存在父子项目,且父子项目的jar包都需要上传到 *
- 前言Apache POI [1] 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Mi
- 本文实例为大家分享了Android ViewPager实现轮播图效果的具体代码,供大家参考,具体内容如下先上一张效果图:说到ViewPage
- 一,使用背景之前遇到一个需求,是需要将一个json文件解析存储到数据库中。一开始测试的时候,json文件的大小都在几兆以内,所以直接将jso
- 本文实例为大家分享了android实现倒计时动态圈的具体代码,供大家参考,具体内容如下效果是这样,没动图:布局:<LinearLayo
- 为了重用Fragment UI 组件,在设计中你应该通过定义每一个fragemnt自己的layout和行为,让fragment的自包含和模块