递归回溯之小老鼠出迷宫问题

直接看代码

  1. /**
  2. * @ClassName MiGong01
  3. * @Description TODO
  4. * @Author Orange
  5. * @Date 2021/4/16 8:08
  6. * @Version 1.0
  7. **/
  8. public class MiGong01 {
  9. public static void main(String[] args) {
  10. int [][] map = new int [10][10]; //设置迷宫大小
  11. for(int i = 0; i < map.length; i++) { //设置迷宫形状
  12. for (int j =0; j < map[i].length; j++) {
  13. map[0][j] = 1;
  14. map[9][j] = 1;
  15. }
  16. map[i][0] = 1;
  17. map[i][9] = 1;
  18. }
  19. map[3][1] = 1; //设置迷宫障碍物的位置
  20. map[3][2] = 1;
  21. map[3][3] = 1;
  22. map[3][4] = 1;
  23. map[2][4] = 1;
  24. map[2][5] = 1;
  25. map[4][6] = 1;
  26. map[5][5] = 1;
  27. map[5][6] = 1;
  28. map[5][7] = 1;
  29. map[5][8] = 1;
  30. map[6][4] = 1;
  31. map[6][5] = 1;
  32. map[7][4] = 1;
  33. System.out.println("=====当前地图情况======");
  34. for(int i = 0; i < map.length; i++) {
  35. for (int j = 0; j < map[i].length; j++) {
  36. System.out.print(map[i][j] + " "); //输出一行
  37. }
  38. System.out.println();
  39. }
  40. Find F1 = new Find();
  41. //下右上左
  42. F1.findWay(map, 1, 1);
  43. System.out.println("\n==第三种找路的情况如下==");
  44. for(int i = 0; i < map.length; i++) {
  45. for(int j = 0; j < map[i].length; j++) {
  46. System.out.print(map[i][j] + " "); //输出一行
  47. }
  48. System.out.println();
  49. }
  50. }
  51. }
  52. class Find {
  53. //使用递归回溯的思想来解决老鼠出迷宫
  54. //1. findWay 方法就是专门来找出迷宫的路径
  55. //2. 如果找到,就返回true ,否则返回false
  56. //3. map 就是二维数组,即表示迷宫
  57. //4. i,j 就是老鼠的位置,初始化的位置为(1,1)
  58. //5. 因为我们是递归的找路,所以我先规定map 数组的各个值的含义
  59. // 0表示可以走 1表示障碍物 2表示可以走 3表示走过,但是走不通是死路
  60. //6. 当map[8][8] =2 就说明找到通路,就可以结束,否则就继续找.
  61. //7. 先确定老鼠找路策略下->右->上->左
  62. public boolean findWay(int[][] map , int i, int j) {
  63. if (map[8][8] == 2) { //说明已经找到
  64. return true;
  65. } else {
  66. if (map[i][j] == 0) { //当前这个位置0,说明表示可以走
  67. //我们假定可以走通
  68. map[i][j] = 2;
  69. //使用找路策略,来确定该位置是否真的可以走通
  70. //下->右->上->左
  71. if (findWay(map, i + 1, j)) { //先走下
  72. return true;
  73. } else if (findWay(map, i, j + 1)) { //右
  74. return true;
  75. } else if (findWay(map, i - 1, j)) { //上
  76. return true;
  77. } else if (findWay(map, i, j - 1)) { //左
  78. return true;
  79. } else {
  80. map[i][j] = 3;
  81. return false;
  82. }
  83. } else { //map[i][j] = 1 , 2, 3
  84. return false;
  85. }
  86. }
  87. }
  88. //修改找路策略,看看路径是否有变化
  89. //下->右->上->左==> 上->右->下->左
  90. public boolean findWay2(int[][] map , int i, int j) {
  91. if (map[8][8] == 2) { //说明已经找到
  92. return true;
  93. } else {
  94. if (map[i][j] == 0) { //当前这个位置0,说明表示可以走
  95. //我们假定可以走通
  96. map[i][j] = 2;
  97. //使用找路策略,来确定该位置是否真的可以走通
  98. //上->右->下->左
  99. if (findWay2(map, i - 1, j)) { //先走上
  100. return true;
  101. } else if (findWay2(map, i, j + 1)) { //右
  102. return true;
  103. } else if (findWay2(map, i + 1, j)) { //下
  104. return true;
  105. } else if (findWay2(map, i, j - 1)) { //左
  106. return true;
  107. } else {
  108. map[i][j] = 3;
  109. return false;
  110. }
  111. } else { //map[i][j] = 1 , 2, 3
  112. return false;
  113. }
  114. }
  115. }
  116. public boolean findWay3(int[][] map , int i, int j) {
  117. if (map[8][8] ==2) { //说明已经找到
  118. return true;
  119. } else {
  120. if (map[i][j] == 0) { //当前这个位置0,说明表示可以走
  121. //我们假定可以走通
  122. map[i][j] = 2;
  123. //使用找路策略,来确定该位置是否真的可以走通
  124. //下->左->上->右
  125. if (findWay3(map, i + 1, j)) { //先走下
  126. return true;
  127. } else if (findWay3(map, i, j - 1)) { //左
  128. return true;
  129. } else if (findWay3(map, i - 1, j)) { //上
  130. return true;
  131. } else if (findWay3(map, i, j + 1)) { //右
  132. return true;
  133. } else {
  134. map[i][j] = 3;
  135. return false;
  136. }
  137. } else { //map[i][j] = 1 , 2, 3
  138. return false;
  139. }
  140. }
  141. }
  142. }
  1. /*程序运行结果:
  2. ---------------------
  3. =====当前地图情况======
  4. 1 1 1 1 1 1 1 1 1 1
  5. 1 0 0 0 0 0 0 0 0 1
  6. 1 0 0 0 1 1 0 0 0 1
  7. 1 1 1 1 1 0 0 0 0 1
  8. 1 0 0 0 0 0 1 0 0 1
  9. 1 0 0 0 0 1 1 1 1 1
  10. 1 0 0 0 1 1 0 0 0 1
  11. 1 0 0 0 1 0 0 0 0 1
  12. 1 0 0 0 0 0 0 0 0 1
  13. 1 1 1 1 1 1 1 1 1 1
  14. ==第三种找路的情况如下==
  15. 1 1 1 1 1 1 1 1 1 1
  16. 1 2 0 2 2 2 2 3 3 1
  17. 1 2 2 2 1 1 2 3 3 1
  18. 1 1 1 1 1 2 2 3 3 1
  19. 1 0 0 0 2 2 1 3 3 1
  20. 1 0 0 2 2 1 1 1 1 1
  21. 1 0 0 2 1 1 0 0 0 1
  22. 1 0 0 2 1 0 0 0 0 1
  23. 1 0 0 2 2 2 2 2 2 1
  24. 1 1 1 1 1 1 1 1 1 1
  25. --------------------*/

过程分析:

  分析如下图↓

Java笔记_递归回溯之小老鼠出迷宫问题的更多相关文章

  1. Java笔记_静态变量和实例变量的区别

    这里简单做一下笔记,区分Java全局变量里的静态变量与实例变量. 1.Java里的全局变量 首先了解Java里的全局变量,也叫成员变量. 特点: (1).一个类中既不在方法体内,也不在程序块内定义的变 ...

  2. [笔记] HOW2J.CN网站记录的java笔记_第四部分_HTML

    1.写一个显示Hello World的网页, <html> <body> <p>Hello World</p> </body> </h ...

  3. servlet(6) - servlet总结 - 小易Java笔记

    垂阅前必看: 这都是我总结的我觉得是学习servlet应该掌握的,我在学习期间也做了一个博客项目来让所学的知识得以巩固.下面就是博客项目链接.前面的servlet相关的笔记总汇,还有就是我把觉得在学习 ...

  4. 8皇后以及N皇后算法探究,回溯算法的JAVA实现,递归方案

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...

  5. JSP(1) - JSP简介、原理、语法 - 小易Java笔记

    1.JSP简介 (1)JSP的全称是Java Server Pages(运行在服务器端的页面),实际就是Servlet(学习JSP的关键就是时刻联想到Servlet) (2)JSP.Servlet各自 ...

  6. Java与算法之(5) - 老鼠走迷宫(深度优先算法)

    小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先 ...

  7. java笔记整理

    Java 笔记整理 包含内容     Unix Java 基础, 数据库(Oracle jdbc Hibernate pl/sql), web, JSP, Struts, Ajax Spring, E ...

  8. Effective Java笔记一 创建和销毁对象

    Effective Java笔记一 创建和销毁对象 第1条 考虑用静态工厂方法代替构造器 第2条 遇到多个构造器参数时要考虑用构建器 第3条 用私有构造器或者枚举类型强化Singleton属性 第4条 ...

  9. React笔记_(3)_react语法2

    React笔记_(3)_react语法2 state和refs props就是在render渲染时,向组件内传递的变量,这个传递是单向的,只能继承下来读取. 如何进行双向传递呢? state (状态机 ...

  10. 算法基础_递归_求杨辉三角第m行第n个数字

    问题描述: 算法基础_递归_求杨辉三角第m行第n个数字(m,n都从0开始) 解题源代码(这里打印出的是杨辉三角某一层的所有数字,没用大数,所以有上限,这里只写基本逻辑,要符合题意的话,把循环去掉就好) ...

随机推荐

  1. JSP第二次作业

    1.p39   实验2 显示当前时间,并输出上午(0-12)好,下午好(13-17),晚上好(18-23) 1 <%@ page language="java" import ...

  2. 一种无损更换iPhone手机铃声方案(无需数据线)

    iPhone用户手机铃声更换的方案,现在网上已经很多方法,包括使用某思助手.通过iTunes等进行更换,后者现在在MacOS系统中已经不支持.注意️:此文章针对与MacOS系统与IOS搭配使用.Win ...

  3. 云萌 V2.6.3.0 win10,win11 Windows永久激活工具

    Windows如果一直不激活,其实用起来问题也不大,除了无法修改壁纸.颜色.锁屏.主题以及无法使用微软账号的同步功能等之外,绝大多数的基本功能都可以正常使用.不过该激活还是得激活的.别的不说,就桌面右 ...

  4. 亲测有效 Hyper V3.4.0 终端美化工具 支持win/mac

    亲测有效 Hyper V3.4.0 终端美化工具 支持win/mac Hyper 是一款终端美化工具 基于Web技术,JS/HTML/CSS ,支持扩展增强,很不错! 且支持win,mac 下载地址 ...

  5. .Net 和 .Net Core 集成Swagger 以及配合JWT身份验证

    Swagger介绍 简单来说swagger是一款WebAPI的接口管理帮助文档,并且可以直接进行接口测试 我们来看一下官网介绍 https://swagger.io Swagger is a powe ...

  6. ubuntu16.04安装官方cartographer

    工作空间名为catkin_cart 1.安装步骤: https://google-cartographer-ros.readthedocs.io/en/latest/compilation.html ...

  7. 推荐系统[一]:超详细知识介绍,一份完整的入门指南,解答推荐系统相关算法流程、衡量指标和应用,以及如何使用jieba分词库进行相似推荐

    1. 推荐算法的初步理解 如果说互联网的目标就是连接一切,那么推荐系统的作用就是建立更加有效率的连接,推荐系统可以更有效率的连接用户与内容和服务,节约了大量的时间和成本. 1.1 推荐系统主要解决问题 ...

  8. 教你用手机的NFC功能模拟门禁卡,实现出门不带卡

    此教程教您将门禁卡.考勤卡.会员卡.停车卡.电梯卡等等各种卡片模拟进NFC手机里,从而用手机代替门禁卡 一.软硬件准备 NFC Tool 手机上的IC卡读写编辑软件,搭配蓝牙读卡器或者OTG读卡器,可 ...

  9. Centos7-RAID冗余磁盘阵列

    转载csdn: Centos7-RAID冗余磁盘阵列_黏住你不让你的博客-CSDN博客

  10. XView 架构升级之路

    作者:京东零售 胡本奎 一 背景 1 是什么 XView是一个透明的塑料袋(容器),基于通用的webview框架改造而来,通常用于大促弹窗等营销场景,展现形式如下图: 2 痛点 在实际的开发使用中XV ...