文章目录

  • 前言
  • 一、回溯法
  • 二、算法应用——迷宫问题
    • 1.问题描述
    • 2.解题思路
  • 三、Java代码实现

前言

本文介绍一种经典算法——回溯法,可作为迷宫问题的一种解法。

一、回溯法

回溯是一种算法思想,用递归实现,类似于枚举的搜索尝试过程。主要思想在于搜索尝试过程中寻找问题的解,当发现不满足求解条件时,则立刻回溯返回,尝试别的解决方案。可作为一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现该选择不优或者无法达到目标,就退回一步重新进行选择,而满足回溯条件的某个状态点称为“回溯点”。

二、算法应用——迷宫问题

1.问题描述

迷宫问题是回溯法的一种应用。迷宫问题的描述为:假设主体放在一个迷宫地图入口处,迷宫中有许多墙,使得大多数的路径都被挡住而无法行进。主体可以通过遍历所有可能到出口的路径来到达出口。当主体走错路时需要将走错的路径记录下来,避免下次走重复的路径,直到找到出口。主体需遵从如下三个原则:

  • 一次步进只能走一格;
  • 遇到路径堵塞后,退后直到找到另一条路径可行;
  • 走过的路径记录下来,不会再走第二次。

2.解题思路

先创建一个二维数组Map[row][col]并进行初始化,Map[i][j]=1表示该位置有墙体无法通过,Map[i][j]=0表示该位置未走过,Map[i][j]=2表示该位置已经走过并且可以走通,Map[i][j]=3表示该位置已经走过并且无法走通。假设Map[1][1]为入口,Map[6][5]为出口。

当主体在迷宫行进的时候有四个方向即上下左右可以选择,如图所示:

三、Java代码实现

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;}//挡板map[3][1] = 1;map[3][2] = 1;map[2][2] = 1;map[6][4] = 1;map[5][4] = 1;map[4][4] = 1;//输出地图System.out.println("原地图:");for (int i = 0; i < 8; i++){for (int j = 0; j < 7; j++){System.out.print(map[i][j]+"\t");}System.out.println();}setWay(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]+"\t");}System.out.println();}}/*** 使用递归回溯找路* 1.i和j表示从地图的(i,j)开始出发* 2.如果能走到map[6][5]则说明通路已经找到* 3.map[i][j]中 0:该点没有走过 1:墙 2:该通路可以走 3:已经走过但是无法走通* 走迷宫时确定一个策略: 下->右->上->左 该点走不通再回溯* @param map 表示地图的数组* @param i   从哪个位置开始找* @param j* @return    找到通路返回true 否则返回false*/public static boolean setWay(int[][] map,int i,int j){//通路已经找到if (map[6][5] == 2){return true;}else{//该点没有走过if (map[i][j] == 0){//策略: 下->右->上->左//先赋值2假定可以走通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;}}}
}

测试结果如下:

原地图:
1   1   1   1   1   1   1
1   0   0   0   0   0   1
1   0   1   0   0   0   1
1   1   1   0   0   0   1
1   0   0   0   1   0   1
1   0   0   0   1   0   1
1   0   0   0   1   0   1
1   1   1   1   1   1   1
递归回溯后得到路线:
1   1   1   1   1   1   1
1   2   2   2   0   0   1
1   3   1   2   0   0   1
1   1   1   2   2   2   1
1   3   3   3   1   2   1
1   3   3   3   1   2   1
1   3   3   3   1   2   1
1   1   1   1   1   1   1

以上。

如有不足或者错误欢迎评论指正。

回溯算法解决迷宫问题相关推荐

  1. 利用广度优先和深度优先算法解决迷宫问题【算法设计与分析】<图搜索问题>

    实验问题: 给定一个n*n的迷宫,要求利用广度优先和深度优先算法解决迷宫问题 问题分析: 对于此问题首先要明确搜索顺序 可以分为两种方法求解问题:1.广度优先算法2.深度优先算法 (1)对于深度优先算 ...

  2. 用栈、回溯算法设计迷宫程序

    目录 1.走迷宫与回溯算法 2.迷宫设计栈扮演的角色 3.Python实现走迷宫 栈的应用有许多,本篇博文着重将栈与回溯(Backtracking)算法结合,设计走迷宫程序.其实回溯算法也是人工智能的 ...

  3. 回溯算法解决八皇后_4皇后问题和使用回溯算法的解决方案

    回溯算法解决八皇后 4-皇后问题 (4 - Queen's problem) In 4- queens problem, we have 4 queens to be placed on a 4*4 ...

  4. 新颖性搜索(Novelty Search,NS)算法实践——利用NS算法解决迷宫导航问题

    新颖性搜索(Novelty Search,NS)算法实践--利用NS算法解决迷宫导航问题 新颖性搜索(Novelty Search,NS)算法介绍 NS实现基础 NovItem NoveltyArch ...

  5. 神经进化算法——利用NEAT算法解决迷宫导航问题(基于NEAT-Python)

    神经进化算法--利用NEAT算法解决迷宫导航问题(基于NEAT-Python) 迷宫导航问题 迷宫环境模拟 迷宫导航智能体 迷宫环境实现 传感器数据生成 导航智能体 智能体位置更新 智能体记录存储 智 ...

  6. 回溯算法解决八皇后问题(JAVA实现)

    送给程序猿们一句话 <拥有水滴石穿的坚持:懂得聚沙成塔的积累:磨练坚韧不拔的意志:学习脚踏实地的奋斗:提升立世做人的技巧:突破自我设限的障碍.> 文章目录 背景 问题解决 思路 什么是回溯 ...

  7. c语言 用回溯算法解决01背包问题,回溯法解决01背包问题

    <回溯法解决01背包问题>由会员分享,可在线阅读,更多相关<回溯法解决01背包问题(21页珍藏版)>请在人人文库网上搜索. 1.回溯法解决01背包问题,回溯法解决01背包问题, ...

  8. 用递归思想和回溯算法解决八皇后问题(java实现)

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

  9. C语言回溯算法解决N皇后问题

    回溯算法的模型是 x++, not satisfy ? x-- : continue. 代码中x作列号,y[x]保存第x列上皇后放置的位置. 1 #include<stdio.h> 2 # ...

最新文章

  1. 千万级在线推送系统架构解析
  2. 用正则表达式作html2RSS服务
  3. 怎么判断日出时间早晚_个个美哭!2020下半年国内旅行时间表出炉!你最想去哪个?...
  4. 前端学习(803):字符串拼接和截取
  5. 【深度学习】Win10安装TensorFlow_gpu(避坑必看)
  6. vue-cli搭建和“Cannot find module npm-cli.js” 、“operation not permitted” 、 deprecated coffee-script等错误
  7. webpack打包优化之外部扩展externals的实际应用
  8. 微信公众号H5支付遇到的那些坑
  9. python--Django从创建一个项目说起
  10. mujoco win7下载安装
  11. 几个很实用的软件 root 改机 软改 硬改 改串号 改设备 参数生成器APK 电脑软件
  12. Android开发之日期、时间选择器(DatePicker和TimePicker)的功能和用法
  13. mingw不能安装_C语言/C++初学——Visual Studio环境的安装配置与使用
  14. IIS-网站报500.19错误代码0x8007000d问题解决
  15. Android软键盘弹不出的问题
  16. Class-incremental Learning via Deep Model Consolidation 翻译
  17. 可编程式坐标--单位圆坐标
  18. Centos下增加swap空间
  19. Python安装教程和Pycham教程
  20. Wifi4更换Wifi6路由器的使用体验

热门文章

  1. tf.sparse.SparseTensor
  2. python flask 路由_python框架之Flask(2)-路由和视图Session
  3. 76. Leetcode 295. 数据流的中位数 (堆-技巧一-固定堆)
  4. 机器学习笔记:RMSProp,Adadelta
  5. 文巾解题 27. 移除元素
  6. Pytorch 笔记——tensor
  7. tableau可视化函数使用案例(六十七)-如何用Tableau获取数据并对数据进行操作?
  8. 编程语言中的Lambda 函数是如何产生的 它究竟有什么用
  9. 多面性的打赏功能,由直播行业引发的一点思考
  10. QT中在Designer中设置QToolButoon上面图标下面文字