Java 数据结构和算法 - 递归和回溯
最编程
2024-06-29 21:20:28
...
package com.szh.recursion;
/**
* 走迷宫问题
*/
public class MiGong {
//使用递归回溯来给小球找路, 说明:
//1. map 表示地图
//2. i,j 表示从地图的哪个位置开始出发 (1,1)
//3. 如果小球能到 map[6][5] 位置,则说明通路找到.
//4. 约定:当 map[i][j] 为 0 表示该点没有走过; 当为 1 表示墙; 2 表示通路可以走;
//5. 在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通,再回溯
public static boolean setWay(int[][] map, int i, int j) {
//此时走到了迷宫终点
if (map[6][5] == 2) {
return true;
} else {
if (map[i][j] == 0) { //如果当前这个点还没有走过
//按照策略 下->右->上->左 走
map[i][j] = 2;
if (setWay(map, i + 1, j)) { //下
return true;
} else if (setWay(map, i, j + 1)) { //右
return true;
} else if (setWay(map, i - 1, j)) { //上
return true;
} else { //左
return true;
}
} else { //map[i][j] != 0, 即只能为1、2。 1表示墙(无法走),2表示已经走过了,所以此时直接返回false
return false;
}
}
}
//修改找路的策略,改成 上->右->下->左
public static boolean setWay2(int[][] map, int i, int j) {
if(map[6][5] == 2) { // 通路已经找到ok
return true;
} else {
if(map[i][j] == 0) { //如果当前这个点还没有走过
//按照策略 上->右->下->左
map[i][j] = 2;
if(setWay2(map, i - 1, j)) { //上
return true;
} else if (setWay2(map, i, j + 1)) { //右
return true;
} else if (setWay2(map, i + 1, j)) { //下
return true;
} else { //左
return true;
}
} else {
return false;
}
}
}
public static void main(String[] args) {
//先创建一个二维数组,模拟迷宫 (地图)
int[][] map = new int[8][7];
//使用迷宫中的部分格子表示墙体(置1)
//第一行和最后一行置为1
for (int i = 0; i < 7; i++) {
map[0][i] = 1;
map[7][i] = 1;
}
//第一列和最后一列置为1
for (int i = 0; i < 8; i++) {
map[i][0] = 1;
map[i][6] = 1;
}
//多添加两块墙体
map[3][1] = 1;
map[3][2] = 1;
// map[1][2] = 1;
// map[2][2] = 1;
//输出地图查看
System.out.println("原始迷宫地图为:");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
//使用递归回溯走迷宫
setWay(map, 1, 1);
// setWay2(map, 1, 1);
System.out.println("小球走过,并标识过的地图的情况:");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j] + " ");
}
System.out.println();
}
}
}
上一篇: 迷宫的最短路径
下一篇: 数据结构与算法 - 递推迷宫问题
推荐阅读
-
Java HashMap 的数据结构和基本原理及其在 Jdk8、Jdk11 和 Jdk17 中的一些变化,以及一些常见问题。
-
解决排列和子集问题的回溯算法
-
实现和简单分析java中的几种排序算法
-
《排序算法》——Java中的堆排序(大顶堆和小顶堆)
-
数据结构与算法--排序算法:堆排序 最大堆(大顶堆)和 最小堆(小顶堆)详解
-
探索二叉树、红黑树、递归树、堆和堆排序的数据结构与算法(第四部分),以及堆的实际应用
-
Java和JS之间实现AES算法加解密通信
-
前端和后端数据互相加解密(AES算法):CryptoJS和Java实现
-
数组和特殊矩阵压缩存储详解(第25讲) - 408数据结构与算法实践解析
-
【2022新手指南】Java编程进阶之路 - 六、技术架构篇 ### MySQL索引底层解析与优化实战 - 你会讲解MySQL索引的数据结构吗?性能调优技巧知多少? - Redis深度揭秘:你知道多少?从基础到哨兵、主从复制全梳理 - Redis持久化及哨兵模式详解,还有集群搭建和Leader选举黑箱打开 - Zookeeper是个啥?特性和应用场景大公开 - ZooKeeper集群搭建攻略及 Leader选举、读写一致性、共享锁实现细节 - 探究ZooKeeper中的Leader选举机制及其在分布式环境中的作用 - Zab协议深入剖析:原理、功能与在Zookeeper中的核心地位 - RabbitMQ全方位解读:工作模式、消费限流、可靠投递与配置策略 - 设计者视角:RabbitMQ过期时间、死信队列与延时队列实践指南 - RocketMQ特性和应用场景揭示:理解其精髓与差异化优势 - Kafka详细介绍:特性及广泛应用于实时数据处理的场景解析 - ElasticSearch实力揭秘:特性概述与作为搜索引擎的广泛应用 - MongoDB认知升级:非关系型数据库的优势阐述,安装与使用实战教学 - BIO/NIO/AIO网络模型对比:掌握它们的区别与在网络编程中的实际应用 - Netty带你飞:理解其超快速度背后的秘密,包括线程模型分析 - 网络通信黑科技:Netty编解码原理与常用编解码器的应用,Protostuff实战演示 - 解密Netty粘包与拆包现象,怎样有效应对这一常见问题 - 自定义Netty心跳检测机制,轻松调整检测间隔时间的艺术 - Dubbo轻骑兵介绍:核心特性概览,服务降级实战与其实现益处 - Dubbo三大神器解读:本地存根与本地伪装的实战运用与优势呈现 ----------------------- 七、结语与回顾