迷宫回溯问题分析和实现

原文链接:传送门

迷宫问题

img

说明:

  • 小球得到的路径,和程序员设置的找路策略有关即:找路的上下左右的顺序相关
  • 再得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是不是有变化
  • 测试回溯现象
  • 思考: 如何求出最短路径?
 //下面代码的找路策略是:下右上左
public static boolean setWay(int[][] map, int i, int j) {if (map[6][5] == 2) { // 表示路已经找到了return true;} else {if (map[i][j] == 0) { // 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,3return false;}
}}
int[][] map = new int[8][7];
//上下全部置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;
}

完整代码

package com.atguigu.recursion;/*** ClassName:  <br/>* Description:  <br/>* Date: 2021-02-22 9:50 <br/>* @project data_algorithm* @package com.atguigu.recursion*/
public class MiGong {public static void main(String[] args) {// 先创建一个二维数组,模拟迷宫// 地图int[][] map = new int[8][7];// 使用1 表示墙// 上下全部置为1for (int i = 0; i < 7; i++) {map[0][i] = 1;map[7][i] = 1;}// 左右全部置为1for (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) {if(map[6][5] == 2) { // 通路已经找到okreturn 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, 3return false;}}}//修改找路的策略,改成 上->右->下->左public static boolean setWay2(int[][] map, int i, int j) {if(map[6][5] == 2) { // 通路已经找到okreturn 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, 3return false;}}}}

运行结果

地图的情况
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 
小球走过,并标识过的 地图的情况
1 1 1 1 1 1 1 
1 2 2 2 2 2 1 
1 0 0 0 0 2 1 
1 1 1 0 0 2 1 
1 0 0 0 0 2 1 
1 0 0 0 0 2 1 
1 0 0 0 0 2 1 
1 1 1 1 1 1 1 Process finished with exit code 0

通过递归,遍历所有方式的路径,共享棋盘中的数组位置数据

实现查找最优解

策略:下->右->上->左

最后噼里啪啦的回去了

回溯

原文链接:传送门

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

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

相关文章

canvas clear 指定属性的元素_好程序员web前端分享CSS属性组成及作用

好程序员web前端分享CSS属性组成及作用学习目标1、css属性和属性值的定义2、css文本属性3、css列表属性4、css背景属性5、css边框属性6、css浮动属性一、css属性和属性值的定义属性&#xff1a;属性是指定选择符所具有的属性&#xff0c;它是css的核心&#xff0c;css2共有150多…

排序算法介绍和分类

原文链接:传送门 排序算法的介绍 排序也成排序算法 排序也称排序算法(Sort Algorithm)&#xff0c;排序是将一组数据&#xff0c;依指定的顺序进行排列的过程。 排序的分类&#xff1a; 1) 内部排序: 指将需要处理的所有数据都加载到**内部存储器(内存)**中进行排序。 2) 外…

认识高清视频编码(MPEG、H.264、WMV-HD、RMVB)

文章出处&#xff1a;www.net1980.com 原创 最近两年&#xff0c;“高清”这个词语非常火热&#xff0c;已经成为家电和IT行业的最新潮流了。高清视频和普通视频有什么区别呢&#xff1f;主要是分辨率上的区别&#xff0c;720P视频的分辨率为1280X720&#xff0c;1080P视频的分…

解读SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC

SPP与SPPF 一、SPP的应用的背景 在卷积神经网络中我们经常看到固定输入的设计&#xff0c;但是如果我们输入的不能是固定尺寸的该怎么办呢&#xff1f; 通常来说&#xff0c;我们有以下几种方法&#xff1a; &#xff08;1&#xff09;对输入进行resize操作&#xff0c;让他们…

go mongodb排序查询_《MongoDB》day two

Mongodb的更新方式有&#xff1f;db.集合名.update() 函数:用于更新已存在的文档。语法格式&#xff1a;db.COLLECTION_NAME.update({查询条件},{更新内容},{更新参数(可选)}) 注&#xff1a;这种方式会覆盖原有的文档。使用更新操作符 使用 save()函数更新文档 Mongodb的updat…

哈希表思路图解和代码实现

原文链接传送门 哈希表(散列)-Google上机题 看一个实际需求&#xff0c;google公司的一个上机题: 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址…),当输入该员工的id时,要求查找到该员工的 所有信息. 要求: 不使用数据库,尽量节省内存,速度越…

glibc交叉编译_TSN之linuxptp交叉编译

0 开发环境1 linuxptp是什么2 为什么要交叉编译linuxptp3 修改makefile4 修改源码5 交叉编译0 开发环境笔记本&#xff1a;ubuntu18.04.5&#xff0c;内核版本为5.3 开发板&#xff1a;imx8mp-evk内核版本&#xff1a;Linux5.4.24交叉编译工具链&#xff1a;fsl-imx-xwayland-g…

声音编码

1.脉冲编码调制PCM文件格式简介 将音频数字化&#xff0c;其实就是将声音数字化。最常见的方式是透过脉冲编码调制PCM(Pulse Code Modulation) 。运作原理如下。首先我们考虑声音经过麦克风&#xff0c;转换成一连串电压变化的信号&#xff0c;如图一所示。这张图的横座标为秒&…

Elastic Stack简介

Elastic Stack简介 如果你没有听说过Elastic Stack&#xff0c;那你一定听说过ELK&#xff0c;实际上ELK是三款软件的简称&#xff0c;分别是Elasticsearch、 Logstash、Kibana组成&#xff0c;在发展的过程中&#xff0c;又有新成员Beats的加入&#xff0c;所以就形成了Elast…

webpack v3 结合 react-router v4 做 dynamic import — 按需加载(懒加载)

为什么要做dynamic import&#xff1f; dynamic import不知道为什么有很多叫法&#xff0c;什么按需加载&#xff0c;懒加载&#xff0c;Code Splitting&#xff0c;代码分页等。总之&#xff0c;就是在SPA&#xff0c;把JS代码分成N个页面份数的文件&#xff0c;不在用户刚进来…

go kegg_工具篇丨GO和KEGG富集不到通路?快试试这个超赞的功能分析工具吧

GO和KEGG富集分析是我们在筛选出差异表达基因之后&#xff0c;都会去做的套路性分析。然鹅……我相信&#xff0c;总有那么一些“倒霉孩子”会遇到跟我一样的窘境吧&#xff0c;好不容易筛选出来的差异基因&#xff0c;尝试了DAVID(https://david.ncifcrf.gov/)、Metascape(htt…

搭建Telnet服务器

搭建Telnet服务器 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 可能大家都知道现在已经很少有人用TELNET服务器&#xff0c; 因为它传输数据是以明文的方式&#xff0c;我们很容易通过抓包软件讲数据进行抓包&a…

table取tr对象 vue_Vue笔记

Vue集成了React和Angular的优点&#xff0c;摒弃了他们的缺点。Vue的官网&#xff1a;https://cn.vuejs.org/v2/api/Vue诞生于2016年&#xff0c;是现在非常流行的MVVM框架。Vue提供了“引包”的使用方法&#xff0c;初学者可以在这之下学习语法。不需要webpack&#xff0c;不需…

Beats入门简介

使用Beat收集nginx日志和指标数据 项目需求 Nginx是一款非常优秀的web服务器&#xff0c;往往nginx服务会作为项目的访问入口&#xff0c;那么&#xff0c;nginx的性能保障就变得非常重要了&#xff0c;如果nginx的运行出现了问题就会对项目有较大的影响&#xff0c;所以&…

可编程led灯带原理_SCPSD-250-04-27派克真空压力传感器故障和工作原理

SCPSD-250-04-27派克PARKER真空压力传感器故障和工作原理PARKER压力开关现货 PARKER压力传感器特价 派克真空压力传感器 PARKER数字压力开关2020年还剩最后2天了&#xff0c;这一年大家都过得不太容易&#xff0c;尤其是我自己这是30年以来过得最艰难的一年&#xff0c;经…

Kibana入门安装与介绍

Kibana入门 Kibana 是一款开源的数据分析和可视化平台&#xff0c;它是 Elastic Stack 成员之一&#xff0c;设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化…

友善串口工具接收数据随机换行_使用Python3+PyQT5+Pyserial 实现简单的串口工具方法...

练手项目&#xff0c;先上图先实现一个简单的串口工具&#xff0c;为之后的上位机做准备代码如下&#xff1a;pyserial_demo.pyimport sys import serial import serial.tools.list_ports from PyQt5 import QtWidgets from PyQt5.QtWidgets import QMessageBox from PyQt5.QtC…

Vue渲染函数

前面的话 Vue 推荐在绝大多数情况下使用 template 来创建HTML。然而在一些场景中&#xff0c;真的需要 JavaScript 的完全编程的能力&#xff0c;这就是 render 函数&#xff0c;它比 template 更接近编译器。本文将详细介绍Vue渲染函数 引入 下面是一个例子&#xff0c;如果要…

Logstash入门简介

Logstash入门简介 介绍 Logstash是一个开源的服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据&#xff0c;转换数据&#xff0c;然后将数据发送到最喜欢的存储库中&#xff08;我们的存储库当然是ElasticSearch&#xff09; 我们回到我们ElasticStack的架构图&a…

Django templates 和 urls 拆分

如果在Django项目 下面新建了blog和polls两个APP应用&#xff0c;在每个APP下面都各自新建自己的url和templates&#xff0c;那么我们需要如何进行项目配置呢&#xff1f; INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, dja…