回溯算法解决迷宫问题
文章目录
- 前言
- 一、回溯法
- 二、算法应用——迷宫问题
- 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
以上。
如有不足或者错误欢迎评论指正。
回溯算法解决迷宫问题相关推荐
- 利用广度优先和深度优先算法解决迷宫问题【算法设计与分析】<图搜索问题>
实验问题: 给定一个n*n的迷宫,要求利用广度优先和深度优先算法解决迷宫问题 问题分析: 对于此问题首先要明确搜索顺序 可以分为两种方法求解问题:1.广度优先算法2.深度优先算法 (1)对于深度优先算 ...
- 用栈、回溯算法设计迷宫程序
目录 1.走迷宫与回溯算法 2.迷宫设计栈扮演的角色 3.Python实现走迷宫 栈的应用有许多,本篇博文着重将栈与回溯(Backtracking)算法结合,设计走迷宫程序.其实回溯算法也是人工智能的 ...
- 回溯算法解决八皇后_4皇后问题和使用回溯算法的解决方案
回溯算法解决八皇后 4-皇后问题 (4 - Queen's problem) In 4- queens problem, we have 4 queens to be placed on a 4*4 ...
- 新颖性搜索(Novelty Search,NS)算法实践——利用NS算法解决迷宫导航问题
新颖性搜索(Novelty Search,NS)算法实践--利用NS算法解决迷宫导航问题 新颖性搜索(Novelty Search,NS)算法介绍 NS实现基础 NovItem NoveltyArch ...
- 神经进化算法——利用NEAT算法解决迷宫导航问题(基于NEAT-Python)
神经进化算法--利用NEAT算法解决迷宫导航问题(基于NEAT-Python) 迷宫导航问题 迷宫环境模拟 迷宫导航智能体 迷宫环境实现 传感器数据生成 导航智能体 智能体位置更新 智能体记录存储 智 ...
- 回溯算法解决八皇后问题(JAVA实现)
送给程序猿们一句话 <拥有水滴石穿的坚持:懂得聚沙成塔的积累:磨练坚韧不拔的意志:学习脚踏实地的奋斗:提升立世做人的技巧:突破自我设限的障碍.> 文章目录 背景 问题解决 思路 什么是回溯 ...
- c语言 用回溯算法解决01背包问题,回溯法解决01背包问题
<回溯法解决01背包问题>由会员分享,可在线阅读,更多相关<回溯法解决01背包问题(21页珍藏版)>请在人人文库网上搜索. 1.回溯法解决01背包问题,回溯法解决01背包问题, ...
- 用递归思想和回溯算法解决八皇后问题(java实现)
八皇后问题 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处 ...
- C语言回溯算法解决N皇后问题
回溯算法的模型是 x++, not satisfy ? x-- : continue. 代码中x作列号,y[x]保存第x列上皇后放置的位置. 1 #include<stdio.h> 2 # ...
最新文章
- 千万级在线推送系统架构解析
- 用正则表达式作html2RSS服务
- 怎么判断日出时间早晚_个个美哭!2020下半年国内旅行时间表出炉!你最想去哪个?...
- 前端学习(803):字符串拼接和截取
- 【深度学习】Win10安装TensorFlow_gpu(避坑必看)
- vue-cli搭建和“Cannot find module npm-cli.js” 、“operation not permitted” 、 deprecated coffee-script等错误
- webpack打包优化之外部扩展externals的实际应用
- 微信公众号H5支付遇到的那些坑
- python--Django从创建一个项目说起
- mujoco win7下载安装
- 几个很实用的软件 root 改机 软改 硬改 改串号 改设备 参数生成器APK 电脑软件
- Android开发之日期、时间选择器(DatePicker和TimePicker)的功能和用法
- mingw不能安装_C语言/C++初学——Visual Studio环境的安装配置与使用
- IIS-网站报500.19错误代码0x8007000d问题解决
- Android软键盘弹不出的问题
- Class-incremental Learning via Deep Model Consolidation 翻译
- 可编程式坐标--单位圆坐标
- Centos下增加swap空间
- Python安装教程和Pycham教程
- Wifi4更换Wifi6路由器的使用体验
热门文章
- tf.sparse.SparseTensor
- python flask 路由_python框架之Flask(2)-路由和视图Session
- 76. Leetcode 295. 数据流的中位数 (堆-技巧一-固定堆)
- 机器学习笔记:RMSProp,Adadelta
- 文巾解题 27. 移除元素
- Pytorch 笔记——tensor
- tableau可视化函数使用案例(六十七)-如何用Tableau获取数据并对数据进行操作?
- 编程语言中的Lambda 函数是如何产生的 它究竟有什么用
- 多面性的打赏功能,由直播行业引发的一点思考
- QT中在Designer中设置QToolButoon上面图标下面文字