java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题

递归

递归需要遵守的重要规则

1) 执行一个方法时,就创建一个新的受保护的独立空间(栈空间)

2) 方法的局部变量是独立的,不会相互影响, 比如 n 变量

3) 如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.

4) 递归 必须向退出递归的条件逼近,否则就是无限递归,出现 StackOverflowError,死龟了:)

5) 当一个方法执行完毕,或者遇到 return,就会返回, 遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕

迷宫问题:

迷宫问题示意图

9a7cb8527db9d290ae9530948eaffc70.png

使用递归回溯来给小球找路

说明

1. map 表示地图

2. i,j 表示从地图的哪个位置开始出发 (1,1)

3. 如果小球能到 map[6][5] 位置,则说明通路找到.

4. 约定: 当 map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通

5. 在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通,再回溯

6.地图标记图

-------------------------------------------------------

地图的情况

1 1 1 1 1 1 1

1 0 0 0 0 0 1

1 0 0 0 0 0 1

1 1 1 0 0 0 1

1 0 0 0 0 0 1

1 0 0 0 0 0 1

1 0 0 0 0 0 1

1 1 1 1 1 1 1

代码实现:

package com.pierce.algorithm;

public class MiGong {

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;

}

//设置挡板, 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();

}

}

//使用递归回溯来给小球找路

//说明

//1. map 表示地图

//2. i,j 表示从地图的哪个位置开始出发 (1,1)

//3. 如果小球能到 map[6][5] 位置,则说明通路找到.

//4. 约定: 当 map[i][j] 为 0 表示该点没有走过 当为 1 表示墙 ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通

//5. 在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通,再回溯

/**

* @param map 表示地图

* @param i 从哪个位置开始找

* @param j

* @return 如果找到通路,就返回 true, 否则返回 false

*/

public static boolean setWay(int[][] map, int i, int j) {

// 通路已经找到 ok

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 if (setWay(map, i, j - 1)) {

return true;

} else {

//说明该点是走不通,是死路

map[i][j] = 3;

return false;

}

} else { // 如果 map[i][j] != 0 , 可能是 1, 2, 3

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 if (setWay2(map, i, j - 1)) { // 向左走

return true;

} else {

//说明该点是走不通,是死路

map[i][j] = 3;

return false;

}

} else { // 如果 map[i][j] != 0 , 可能是 1, 2, 3

return false;

}

}

}

}

运行结果:

小球走过,并标识过的 地图的情况

1 1 1 1 1 1 1

1 2 0 0 0 0 1

1 2 2 2 0 0 1

1 1 1 2 0 0 1

1 0 0 2 0 0 1

1 0 0 2 0 0 1

1 0 0 2 2 2 1

1 1 1 1 1 1 1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java web 自定义异常_Java web, service 层应该通过异常(自定义Exception)来中断业务吗?...

同意&#xff01;但是不是最佳实践还有待商榷&#xff0c;我这里给出自己一直使用的用异常控制流程的方案&#xff0c;分享讨论一下吧。由于JAVA只能有一个返回值&#xff0c;但有时候一个service方法除了返回结果外还真的需要有一些附加信息&#xff0c;比如用户非法操作时要中…

java 数据字典 spring_springboot+redis+切面实现数据字典功能

自定义注解&#xff1a;DataDict&#xff0c;用于bo对象类&#xff0c;需要翻译的属性package com.zddts.common.annotation.dict;import java.lang.annotation.*;/*** 说明&#xff1a;数据字典处理类* Created by luojie on 2019/05/29.*///DataDict( dict"patType"…

java支持多线程吗_Java多线程之一

进程与线程进程进程是进程实体的运行过程&#xff0c;是系统进行资源分配和调度的一个独立单位&#xff0c;比如我们windows电脑上运行的一个程序就是一个进程。在传统进程中进程是资源分配和调度的一个基本单位&#xff0c;在后来引入线程概念后&#xff0c;进程就变成了资源分…

java继承与多态性_Java继承与多态浅析

一、继承1、通过extends继承的父类可以是不加abstract关键字的普通类&#xff0c;也可以是加了abstract关键字的抽象类。继承普通类时可以覆写父类的方法&#xff0c;或者创建自己独有的方法&#xff0c;或者这两 者都不使用。继承抽象类时&#xff0c;必须覆写抽象类中的…

java队列加锁_java并发-----浅析ReentrantLock加锁,解锁过程,公平锁非公平锁,AQS入门,CLH同步队列...

前言为什么需要去了解AQS&#xff0c;AQS&#xff0c;AbstractQueuedSynchronizer&#xff0c;即队列同步器。它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等)&#xff0c;JUC并发包的作者(Doug Lea)期望它能够成为实现大部分同步…

java resttemplate_java-通过resttemplate通过Spring Rest服务发送文...

标题可能看起来很普通,但是没有一个适合我的问题.我有一个REST服务,它接受多部分形式的常规参数和文件.我想使用resttemplate将数据和文件发送到上述rest服务.直到我发送正常的字符串数据为止,没有任何问题.一旦我添加了发送字节的代码,那么我开始收到400错误的请求错误.如果我…

java中string的方法_java中String的常用方法

package com.string;public class string1 {public static void main(String args[]){//将char[]数组转换成Stringchar[] ch{h,我,是,中,国,人};String strnew String(ch);System.out.println(str); //结果为str"我是中国人"//将字符串转换为char数组,方法一使用getC…

Java是否为回文_java语言判断一个数字是否为回文数字

判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为…

java floyd_百度百科里面的floyd算法java的代码,总是无法运行。请问是代码有问题吗,如何编译啊?...

展开全部不能编译运行的说法是错误&#xff0c;但是结果是否正确&#xff0c;我就32313133353236313431303231363533e59b9ee7ad9431333335303539不知道了&#xff0c;我不懂这个算法public class FLOYD {int[][] length null;// 任意两点之间路径长度int[][][] path null;// …

cache数据库和mysql_并发环境下,先操作数据库还是先操作缓存?

原标题&#xff1a;并发环境下&#xff0c;先操作数据库还是先操作缓存&#xff1f;来源&#xff1a;捡田螺的小男孩前言在分布式系统中&#xff0c;缓存和数据库同时存在时&#xff0c;如果有写操作&#xff0c;先操作数据库还是先操作缓存呢&#xff1f;本文将分5种方案 展开…

contab 手动可以 java_crontab 定时执行脚本出错,但手动执行脚本正常

原因&#xff1a; crontab 没有去读环境变量&#xff0c;需要再脚本中手动引入环境变量&#xff0c;可以用source 也可以用export 写死环境变量。为了定时监控Linux系统CPU、内存、负载的使用情况&#xff0c;写了个Shell脚本&#xff0c;当达到一定值得时候&#xff0c;发送邮…

java的mybatis批量更新_mybatis批量更新的问题

一、问题描述场景描述&#xff1a;有这样一个service方法&#xff0c;调用了两个dao中的方法。第一个方法按照传入的id批量更新用户名。第二个dao方法无数据库操作&#xff0c;仅仅抛出一个RuntimeException.这个service方法通过xml配置由spring事务管理的。两个DAO类中分别有S…

java 查看垃圾收集器_JVM系列:查看JVM使用的什么垃圾收集器

一、方法一打印虚拟机所有参数[rootlocalhost ~]# java -XX:PrintFlagsFinal -version | grep :uintx InitialHeapSize : 258689024 {product}uintx MaxHeapSize : 4139778048 {product}bool PrintFlagsFinal : true {product}bool UseCompressedOops : true {lp64_product}boo…

java在W n8安装_在windows中安装JDK8并配置环境变量-java环境变量设置

学习JAVA&#xff0c;必须得安装一下JDK(Java development kit java开发工具包)&#xff0c;配置一下环境就可以学习JAVA了&#xff0c;下面是下载和安装JDK的教程&#xff1a;一、去oracle官网上下载jdk8的下载地址&#xff1a;https://www.oracle.com/technetwork/java/javas…

lisp java_从Java调用的LISP代码

长篇小说:我正在为我的函数编程类做一个项目,我想到在Lisp中为Mario AI competition.我正在研究从Java调用LISP代码的框架/库/方式,甚至更好的LISP Java互通信。我看过Jacol但它是旧的,对我来说也不是很好。到目前为止,我的最佳选择是:Jatha.它真的很整洁,虽然一些Lisp构造还没…

java将图片上传数据库_〔技巧实例〕轻松实现将上传图片到数据库

很久就想自己写一写程序了&#xff0c;不过由于赖就不想写我&#xff0c;今天刚好有空&#xff0c;所以写了这个小小的程序很容易一看就知道的&#xff0c;不多说了就此开始&#xff1a;我们做一个上传的。数据据库的字段就id自动编号 big 字段类型是 OLE 呵呵就简单的那个字段…

mysql带参数的sql_MySql存储过程是带参数的存储过程(动态执行SQL语句)

下文介绍的MySql存储过程是带参数的存储过程(动态执行SQL语句)&#xff0c;该MySql存储过程是根据用户输入的条件和排序方式查询用户的信息&#xff0c;排序条件可以没有调用方式&#xff1a;call GetUsersDynamic(age<30,);/********动态查询用户的信息********/CREATE PRO…

java 注释 depredated_depredated是什么意思_depredated怎么读_depredated翻译_用法_发音_词组_同反义词-新东方在线英语词典...

双语例句1.Theentireareahasbeendepredatedinthewar.整个地区在战争中都遭到破坏。2.WehopethatHaitiwhich washeavilydepredatedby the killerquakewillbereconstructedintheforseeablefuture.我们希望在大地震中受重创的海地在不久的将来可以重建。3.TwoIssuesonAddresseesDe…

java计算雷达扫描范围_雷达扫描 - linyinmobayu - 博客园

1、设计思想雷达扫描图&#xff0c;在影视作品中见到较多&#xff0c;比如飞机雷达、舰艇雷达&#xff0c;有一个扫描线转圈代表雷达一周旋转或一个批次的收发&#xff0c;发现目标就在表盘上标记位置。和汽车仪表盘类似&#xff0c;汽车仪表盘有底盘背景图、同圆、刻度、刻度值…

mysql降序后去重_Mysql 数据记录去重后按字段排序

实现效果&#xff1a;去重—取最新的—排序例子 : 按用户ID获取历史记录中某个人的记录&#xff0c;要求非重复的且每条只获取最新的&#xff0c;同时按添加时间倒序排列的实现 &#xff1a;SELECT *FROM (SELECT *FROM historysWHERE types_id1ORDER BY created DESC) AS BGRO…