如图一只小老鼠从起点通过一些障碍到达终点,四周的墙壁不能通行,求通过计算得出迷宫路径,使老鼠成功逃出迷宫

算法设计

①分而治之思想:

首先将老鼠出迷宫问题分成两部分求解,第一,迷宫的设计,第二,迷宫的解法。

迷宫设计:

看到一张矩形图,我们就要想到二维数组,一种抽象的一维数组,通过二维数组即可生成一张迷宫的框架,其次就是障碍的设置,通过对二维数组一些位置进行赋值,即可生成障碍,这样一张迷宫基本就生成了。

迷宫解法:

设计好迷宫之后,就要找出算法来求解,已知老鼠的行进方向有上下左右四种方向,我们在规定好老鼠的起始位置和终点位置后,可以设计老鼠行进路线,假设老鼠从起始位置开始行进(按照默认顺序下右上左),每经过一个坐标就进行标记,当遇到障碍后按照默认顺序折返,在重复之前的动作,即回溯,通过不断回溯最终就会到达指定位置,此时路径留下的坐标就是迷宫的路线解。

②回溯递归思想:

通过上面的迷宫解法也很容易知道递归思想的运用,我们已知迷宫的入口,结合老鼠的行进动作(下右上左)以及障碍的干扰,先得出老鼠第一步路线,先向下判断有没有障碍,没有则继续向下走,如果遇到障碍则向右进行判断有没有障碍,若没有则向右走,此时在向下判断有无障碍,没有则向下走,通过不断回溯递归就能得出一条路线。

具体代码

import java.util.Scanner;
public class migong {public static void main(String[] args){AA size  = new AA();Scanner print = new Scanner(System.in);System.out.println("请输入地图的长和宽");int length = print.nextInt();int wide = print.nextInt();int arr[][] = size.map(wide,length ); //调用函数制作地图并将结果传递给main中数组//遍历二维数组System.out.println("地图如下:");for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + " ");}System.out.println(); //每输出一层换行}System.out.println();BB find = new BB();System.out.println("请输入老鼠的起始位置(x>1):");int start1 =print.nextInt();int start2 =print.nextInt();find.findway(arr,start1,start2,wide,length);System.out.println("通关路径如下:");for (int i = 0; i < arr.length; i++) {for (int j = 0; j < arr[i].length; j++) {System.out.print(arr[i][j] + " ");}System.out.println(); //每输出一层换行}}
}
class AA{ //地图表示方法(1代表障碍 0代表空路 2代表路径 3代表死路)public   int[][]  map(int n1,int n2) {int arr[][] = new int[n1][n2]; //定义二维数组大小//第一行和最后一行为置为1for (int i = 0; i < n2; i++) {arr[0][i] = 1;arr[n1-1][i] = 1; //这里要减1目的是与下标一致}//第一列和最后一列为置为1for (int i = 0; i < n1; i++) {arr[i][0] = 1;arr[i][n2-1] = 1;}//设置路障arr[3][1] = 1;arr[3][4] = 1;arr[5][2] = 1;return arr;  //返回arr数组给main方法}
}
class BB{  //寻找路径方法public boolean findway(int arr[][],int m,int n,int x,int y) { //定义m,n为起始位置if (arr[x-2][y-2] == 2) {return true; //设置通关路口为右下角(角口)} else {if (arr[m][n] == 0) {   //当这个位置为0时代表可以走arr[m][n] = 2;  //用2来表示走过的路径//定义行走的路径顺序(下>右>上>左),采用回溯递归思想。走不通就回头if (findway(arr, m + 1, n,x,y)) {return true;} else if (findway(arr, m, n + 1,x,y)) {return true;} else if (findway(arr, m - 1, n,x,y)) {return true;} else if (findway(arr, m, n - 1,x,y)) {return true;} else {arr[m][n] = 3; //表示死路return false;}} else {   //如果没通关继续此时坐标为1,2,3return false;}}}
}

总结

①通过两个方法,地图制作,迷宫求解,实现了对数据的封装,大大简化了问题的复杂度

②,通过一个问题,将多种知识串联起来,for循环,数组内存分配,类和对象以及传参机制等等

③通过动态开辟数组,以及传参,输入,将方法联立起来,提高了内聚性,同时也使得程序能更加灵活(可以定义迷宫大小,老鼠初始位置,障碍设置)

java实现老鼠出迷宫相关推荐

  1. 老鼠出迷宫问题(Java)(递归)

    问题描述: 老鼠出迷宫:一只老鼠被放入迷宫之中,迷宫中设有障碍物(墙),通过向上,下,左,右移动,从而,找出正确的路线,抵达指定位置,从而走出迷宫.迷宫如图所示: 我们可以假设小老鼠的起始位置在A点, ...

  2. java代码老鼠走迷宫案例

    java代码老鼠走迷宫案例 public class MiGong{//编写一个main方法public static void main(String[] args) {//思路// 1. 先创建迷 ...

  3. 递归问题之老鼠出迷宫

    1.小球得到的路径,和程序员设置的找路策略有关,即:找路的上下左右的顺序相关 2.在得到小球路径时,可以先使用(下右上左),再改成(上右下左),看看路径是不是有变化 3.测试回溯现象 迷宫地图 主函数 ...

  4. 老鼠出迷宫问题(递归问题)

    public class MiGong{public static void main(String[] args){//思路 //1. 先创建迷宫,用二维数组表示 int[][]//2. 先规定 m ...

  5. java递归老鼠走迷宫_递归算法求老鼠走迷宫(C语言)

    /*说明老鼠走迷宫是递回求解的基本题型,我们在二维阵列中使用2表示迷宫墙壁, 使用1来表示老鼠的行走路径,试以程式求出由入口至出口的路径. 解法老鼠的走法有上.左.下.右四个方向,在每前进一格之后就选 ...

  6. 递归回溯——老鼠出迷宫

    目录 前言 设计思路 绘制地图 寻找出路 绘制路线 总结 前言 这是一道关于递归回溯的经典题目,在布下障碍的迷宫中,为老鼠朋友找到一条可以逃出困境的路线,本文将为大家详细讲解如何运行递归的方法让老鼠走 ...

  7. java递归老鼠走迷宫_老鼠走迷宫----------递归问题

    老鼠走迷宫是一个典型的递归的问题,写几个这样的题才可以充分理解递归的过程. 写递归的过程有几点需要注意: (1)递归结束的条件 (2)递归过程的脉络,即逻辑要清晰. / // // 在迷宫中显示老鼠能 ...

  8. java怎样找出迷宫中所有路径_Java寻找迷宫路径

    问题: /* 用非递归的栈来解决 用类来解决迷宫路径的查找问题,寻找一条从左上角迷宫入口 到右下角迷宫出口的一条有效路径,0代表可以行走,1代表不能行走, 找到,请输入最终的迷宫和路径信息, 找不到, ...

  9. 递归老鼠出迷宫,猴子吃桃练习以及注意事项。

    public class Method02 {public static void main(String[] args) {/*请使用递归的方式求出斐波那契数思路分析1.当N=1时,接过为12.当n ...

最新文章

  1. error:CLEARTEXT communication to api.help.bj.cn not permitted by network security policy
  2. 浅析Linux IO
  3. Day4-Springmvc表单数据
  4. zookeeper笔记+源码刨析
  5. 共享单车数据集_共享单车数据可视化报告
  6. python树形_Python处理树形数组
  7. std::string格式化输入输出
  8. 少儿编程100讲轻松学python(四)-python如何判断是否为数字字符串
  9. 超越Android:探索Kotlin的应用领域
  10. python微控制器编程从零开始 豆瓣_从零开始(什么是编程)认识python
  11. ElasticSearch预警服务-Watcher详解-Schedule配置
  12. 大型文件传输慢、传输中断怎么办?
  13. 反证法与归谬法的区别
  14. linux 搭建离线下载文件,不经意间用wget给自己搭建了一个离线下载服务器
  15. 《美好企业》导读:企业家需要超越世俗的成功
  16. 计算机视觉不规则roi原理,C++ 中利用 Opencv 得到不规则的ROI 区域(已知不规则区域)...
  17. java无响应_Java HttpClient请求无响应解决方案
  18. odoo 仪表盘 大屏设计模块cus_dashboard支持odoo16 15 14 13 12
  19. 使用fiddler手机微信小程序抓包
  20. 懒惰型性格分析,如何改变懒惰型性格?

热门文章

  1. Python爬取系列妹子图实战总结(程序员节福利哟)
  2. 设计已读和未读的公告
  3. 剑指offer 专项突破版 73、狒狒吃香蕉
  4. 第一章、计算机网络与英特网(重点知识梳理)
  5. 6.计算机网络与因特网发展简史
  6. 我爱你宠物网——创业笔记(三)
  7. 主权财富基金刺痛发达国家神经
  8. mac电脑循环次数多少算新_2020年度最佳Mac端App新鲜出炉!今年,你发现了哪些好软件?...
  9. STP生成树协议详情
  10. 巧用 即刻搜索事件 input propertychange 监听输入框字数