网站首页 > java教程 正文
迷宫求解是一个经典的搜索问题,可以使用深度优先搜索(DFS)算法来解决。DFS算法需要回溯,而栈(Stack)数据结构则非常适合用于实现回溯。
在迷宫求解中,我们可以将迷宫视为一个二维网格,每个格子要么是墙壁(不可通过),要么是空地(可通过)。我们的目标是找到一条从起点到终点的路径。
使用栈进行迷宫求解的大致步骤如下:
1,初始化栈,将起点位置压入栈中,并标记起点为已访问。
2,进入循环,当栈不为空时执行以下步骤:a. 从栈中弹出一个位置。b. 检查当前位置是否是终点,如果是,则找到路径,结束循环。c. 如果不是终点,则尝试当前位置的四个方向(上、右、下、左)。d. 对于每个方向,检查新位置是否在迷宫内且是空地且未被访问过。如果满足条件,将新位置压入栈中,并标记为已访问。
3,如果循环结束仍未找到路径,则输出无解。
代码示例(可直接运行查看结果):
import java.util.Stack;
public class MazeSolver {
private static final int EMPTY = 0; // 空地
private static final int WALL = 1; // 墙壁
private static final int VISITED = 2; // 已访问
private static final int[][] DIRECTIONS = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}}; // 上下左右四个方向
private int[][] maze; // 迷宫二维数组
private int rows; // 迷宫的行数
private int cols; // 迷宫的列数
private int startRow; // 起点行坐标
private int startCol; // 起点列坐标
private int endRow; // 终点行坐标
private int endCol; // 终点列坐标
public MazeSolver(int[][] maze, int startRow, int startCol, int endRow, int endCol) {
this.maze = maze;
this.rows = maze.length;
this.cols = maze[0].length;
this.startRow = startRow;
this.startCol = startCol;
this.endRow = endRow;
this.endCol = endCol;
}
public boolean solve() {
Stack<int[]> stack = new Stack<>();
maze[startRow][startCol] = VISITED; // 标记起点为已访问
stack.push(new int[]{startRow, startCol});
while (!stack.isEmpty()) {
int[] current = stack.pop();
int row = current[0];
int col = current[1];
// 如果当前位置是终点,则找到路径
if (row == endRow && col == endCol) {
return true;
}
// 尝试四个方向
for (int[] direction : DIRECTIONS) {
int newRow = row + direction[0];
int newCol = col + direction[1];
// 检查新位置是否在迷宫内且是空地且未被访问过
if (newRow >= 0 && newRow < rows && newCol >= 0 && newCol < cols && maze[newRow][newCol] == EMPTY) {
maze[newRow][newCol] = VISITED; // 标记新位置为已访问
stack.push(new int[]{newRow, newCol}); // 将新位置压入栈中
}
}
}
// 栈为空时仍未找到路径
return false;
}
public void printMaze() {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (maze[i][j] == EMPTY) {
System.out.print(" ");
} else if (maze[i][j] == WALL) {
System.out.print("##");
} else {
System.out.print("**");
}
}
System.out.println();
}
}
public static void main(String[] args) {
// 定义迷宫
int[][] maze = {
{0, 0, 0, 0, 0},
{1, 1, 0, 1, 0},
{0, 0, 0, 0, 0},
{0, 1, 1, 1, 1},
{0, 0, 0, 0, 0}
};
// 定义起点和终点
int startRow = 0;
int startCol = 0;
int endRow = 4;
int endCol = 4;
// 创建迷宫求解器并求解
MazeSolver solver = new MazeSolver(maze, startRow, startCol, endRow, endCol);
boolean found = solver.solve();
// 输出结果
if (found) {
System.out.println("找到路径!");
solver.printMaze();
} else {
System.out.println("未找到路径。");
}
}
}
猜你喜欢
- 2024-11-12 本地方法栈、JVM栈、本地内存和JVM Heap的区别与关系
- 2024-11-12 Java基础之堆、栈、方法区、类加载器——JVM内存模型分析
- 2024-11-12 java之栈内存与堆内存(栈内存 和堆内存)
- 2024-11-12 深入了解Java虚拟机栈以及内存模型
- 2024-11-12 Java虚拟机栈区域(虚拟机栈描述的是java方法执行的内存模型)
- 2024-11-12 一文读懂Java的“栈内存”[Stack]和“堆空间”[Heap]
- 2024-11-12 JVM 内存结构(jvm内存结构及作用)
- 2024-11-12 「JVM系列」 从一到掌握JVM系列之Java虚拟机栈
- 2024-11-12 答读者问:Java 里的堆内存和栈内存是什么意思?
- 2024-11-12 Java中堆和栈的区别(java中堆和栈的区别在哪)
你 发表评论:
欢迎- 06-15Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 06-15推荐一款超棒的SpringCloud 脚手架项目
- 06-15IDEA将项目打包成jar包(idea打包普通java项目)
- 06-15Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 06-15记录Dockerfile将jar包构建成部署所需的镜像
- 06-15项目基础部署汇总八---linux下xxl-job安装
- 06-15Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 06-15终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 最近发表
-
- Linux中如何通过Shell脚本来控制Spring Boot的Jar包启停服务?
- 推荐一款超棒的SpringCloud 脚手架项目
- IDEA将项目打包成jar包(idea打包普通java项目)
- Spring Boot3 项目 jar 包打包成 Docker 镜像全攻略
- 记录Dockerfile将jar包构建成部署所需的镜像
- 项目基础部署汇总八---linux下xxl-job安装
- Spring Boot Jar 包秒变 Docker 镜像实现多环境部署
- 终端执行 java -jar example.jar 时报错:“没有主清单属性” 的解决
- 如何将本地JAR文件添加到Maven项目中
- Java 类隔离应用:多 Jar 包支持(java接口隔离原则)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)