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,一经查实,立即删除!

相关文章

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

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

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…

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

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

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…

linux php 守护进程,PHP程序员玩转Linux系列 使用supervisor实现守护进程

PHP程序员玩转Linux系列文章&#xff1a;首先遇到的问题是,部署nodejs的博客程序时,我把执行nodejs的命令放到后台,使用加&和nohup命令如:nodejs index.js & 或者 nohup nodejs index.js &&这个使用是当退出此次终端会话的时候就会停止, nohup这个命令理论上是…

计算机初级包括php吗,计算机的基本组成包括什么

计算机的基本组成包括控制器、运算器、存储器、输入设备和输出设备。其中&#xff0c;控制器是整个计算机的中枢神经&#xff0c;它的功能是对程序规定的控制信息进行解释&#xff0c;根据其要求进行控制&#xff0c;调度程序、数据&#xff0c;协调计算机各部分工作及内存与外…

ubuntu11.10 源码编译安装php5.3.8,Ubuntu 11.10编译安装Nginx、PHP 5.3.8、MySQL、MongoDB、Memcached、SSL、SMTP...

手动安装php mongo扩展sudo apt-get install autoconfwget http://pecl.php.net/get/mongo-1.2.6.tgztar -zxvf mongo-1.2.6.tgzcd mongo-1.2.6/usr/local/php/bin/phpize./configure --with-php-config/usr/local/php/bin/php-configmakesudo make installecho extension mon…

java实现图像处理高通滤波,图像处理入门——滤波 - leo_de_macondo的个人页面 - OSCHINA - 中文开源技术交流社区...

模糊图像模糊的方法可以将每个像素的rgb值用周围像素的加权平均值来代替。比如用周围的9个像素来计算加权平均值&#xff0c;权值可以用一个3x3的矩阵来表示&#xff1a;| 1 2 1 || 2 4 2 | * (1/16)| 1 2 1 |中间的像素是要处理的像素&#xff0c;越靠近中间权…

matlab数据接口技术,matlab接口技术与应用

matlab接口技术与应用来源&#xff1a;mamingkeda作者&#xff1a;华仔浏览&#xff1a;1070时间&#xff1a;2016-08-10 14:18标签&#xff1a;摘要&#xff1a;matlab接口技术与应用应用程序接口的使用方法。全书分为10章&#xff0c;第1章是matlab环境和编程语言的概述&…

ssrf 过滤.php,SSRF技巧之如何绕过filter_var( )

0x00 前言前几天我读了两篇非常棒的论文&#xff1a;第一篇是发表在blackhat.com上的“A New Era of SSRF ”&#xff0c;讲述的是不同编程语言的SSRF问题&#xff1b;第二篇是由Positive Technology发表的一篇名为“PHP Wrapper” 的论文&#xff0c;它主要讲述的是如何以多种…

如何用notepad写php,notepad新手怎么使用

新手使用notepad的几个小技巧&#xff1a;一、软件始终置于屏幕最前方有时候我们在运行程序时&#xff0c;需要将notepad放置到屏幕最前方&#xff0c;此时只需要在工具栏中点击&#xff1a;view——always on tops&#xff1b;此时notepad就会一直处于屏幕最前方。注&#xff…

双网卡主机配置oracle监听,VirtualBox设置双网卡实现虚机上网及主宿机互访

VirtualBox 虚拟机之间互连、主宿机互连、以及主宿机连接互联网的功能非常实用。下面介绍实现主宿机通过虚拟网卡互连方式。1 全局配置VirtualBox安装完成后&#xff0c;会在系统中装一块虚拟网卡&#xff0c;我们在 管理> 全局设定中可以看到。这块网卡是在 Host-Only 连接…

linux无filelength函数,Linux Shell 自定义函数(定义、返回值、变量作用域)介绍

定义Shell函数(define function) 语法&#xff1a;[ function ] funname [()]{action;[return int;]}说明&#xff1a;可以带function fun() 定义&#xff0c;也可以直接fun() 定义,不带任何参数。参数返回&#xff0c;可以显示加&#xff1a;return 返回&#xff0c;如果不加&…

linux ssh登录历史,Linux中的SSH登录

在Linux系统中需要使用SSH远程登录到另一个Linux系统&#xff0c;可以使用SSH命令加用户和IP地址的方法。ssh命令用于远程登录上的Linux主机。常用格式&#xff1a;ssh [-l login_name] [ –p port] [userhostname]例如不指定用户&#xff1a;ssh 192.168.0.100指定用户&#x…

linux监控电脑配置,Zabbix基本配置及监控主机

监控主机一版需要在被监控的主机上安装Zabbix Agent监控主机安装zabbix-agent首先需要在被监控的主机上安装agent&#xff0c;可以下载预编译好的RPM进行安装&#xff0c;下载地址&#xff1a;http://www.zabbix.com/download也可以源码安装&#xff0c;类似server的安装&#…

linux内网安装git,一键安装GitLab7在RHEL6.4上

&#xff11; 关于gitlab7无论如何gitlab是个好东西&#xff0c;但是极难安装和配置。bitnami(https://bitnami.com/)的一键安装包虽然可以解决大问题&#xff0c;但是仍有很多人无法配置gitlabnginx和email发送等等问题。今天特意完整地再梳理一次。对各位读者的问题不再逐一…

linux显示点阵字体,Fedora 17中文字体显示点阵状的解决方法

在Fedora 17中文字体的显示变成点阵状了&#xff0c;为什么在Fedora 16下中文字体是文泉驿正黑。到Fedora 17之后&#xff0c;中文字体由文泉驿正黑(WenQuanYi Zen Hei)变为WenQuanYi Zen Hei Sharp。这个新字体的特殊之处就是在12磅及以下的中文字体&#xff0c;将显示成点阵字…

c语言打印空心矩形图案的程序,C语言之输出空心棱形图案

#include#includevoid main(){int n,j,i; /*i为行数,j为每行中的项数*/printf("输入图案上三角的高度n:");scanf("%d",&n);;i < n;i) /*打印上三角&#xff0c;(包括中间行)*/{;j < n - i;j){-i || j n - - i * i )printf(" *");el…