标题:机器人走迷宫破壁解法(适用于走迷宫、最短路径算法)-20200412
问题描述:

  1. 一块矩形方格,含有障碍和可通行格子,求从某一点到另外一点的最短距离?N*M的矩阵;
    其中,1代表障碍,0代表可通行;示例:给定二维矩阵
    0 0 1 0
    0 1 0 0
    0 0 0 0
    0 0 0 0

出发点坐标[0, 0],终点坐标[0, 3];
假如最多有一次破障碍格子的机会,java编写int solve(int[][] grids, int[] start, int[] end)返回最短距离;BFS

思路:
(1)当然可用dfs深度优先遍历;但是,有没有BFS呢?
dfs的特点:找到每条完整路径再返回,不到黄河心不死;
bfs:尽量扩散,看是否能走到终点;
(2)考虑BFS,每次按层遍历,在破壁和不破壁的情况下,最远可以走多远;已经破壁则不能再破壁了;
(3)那么有人问?到底何时破壁呢?尽早破壁,尽快扩散;基于扩散的点再次扩散;尽早到达最远;
例如:
0 0 1 0
0 1 0 0
0 0 0 0
0 0 0 0
第一层壁不破,更待何时?破除四周的障碍,谁最早到达外层,谁就获胜。因为各自距离是相等的,是无权图。
第一步:[0, 0]的下一层点集:[0, 1],[1, 0];这是在破壁和不破壁达到的最远点;
第二步:基于[0, 1],[1, 0],最多可以扩散哪些点?同样,找破壁和不破壁到达节点的并集;已经访问过的就不要再访问了。
[0, 1]可以访问的点:破壁的才能访问,同时记录状态:已经破壁一次。[0, 2],[1, 1];
[1, 0]可以访问的[2,0];不破壁的情况下可以访问。
并集:[0, 2],[1, 1],[2,0];前两个是破壁一次访问的,后一个是非破壁访问的。
第三步:
[0, 2]可达[0, 3];其实就是终点,直接可达return;
[1, 1],[2,0]:不用看了;
下面看bfs解法;

dfs思路:
(1)[0, 0]到[0, 3]的距离最短,[0,0]等价于相邻点[0, 1],[1, 0]分别到终点的距离最小值,再加上邻近的1;对于是否破壁求分支;
dfs([0,0],[0,3])等价于:
min(dfs([0,1],[0,3],破壁),dfs([0,1],[0,3],未用破壁), dfs([1,0],[0,3],破壁),dfs([1,0],[0,3],未破壁));
不需要破壁时就不用;考虑破壁与否和四个方向求最小值;遍历次数太多;

更复杂场景,若给多次机会,如何解呢?亦是尽早破壁,走得最远;

package robot;

import java.util.LinkedList;
import java.util.Queue;

public class SolutionUpdate {
int[][] direct = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

// 方格的bfs;
public int bfs(int[][] grids, int[] start, int[] end) {// 写是否已经访问的状态;int[][] state = new int[grids.length][grids[0].length];Queue queue = new LinkedList();// 入队时标记是否破壁。0:未使用;1:已使用;state[start[0]][start[1]] = 1;queue.offer(new int[]{start[0], start[1], 0});int count = 0;while (!queue.isEmpty()) {// 扩散开始count++;// 每次要把扩散一次的节点全部拿出来,才能进行下一步扩散;System.out.println("queue size is:" + queue.size());int size = queue.size();for (int inx = 0; inx < size; inx++) {int[] node = (int[]) queue.poll();// 当扩散到终点就拉出来;注意:若要打印最短路径,到达终点时可以拉出来;if (node[0] == end[0] && node[1] == end[1]) {// 起点塞进来已经加1,故要减去;return count - 1;}for (int[] item : direct) {int nextX = node[0] + item[0];int nextY = node[1] + item[1];if (nextX >= 0 && nextX <= grids.length - 1&& nextY >= 0 && nextY <= grids[0].length - 1&& state[nextX][nextY] != 1) {System.out.println("queue size: " + queue.size()+"--;" +node[0] + "," + node[1] + ";" + "--:" + nextX + "," + nextY + "");if (node[2] == 0 && grids[nextX][nextY] == 0) {// 不用破壁queue.offer(new int[]{nextX, nextY, 0});state[nextX][nextY] = 1;} else if (node[2] == 0 && grids[nextX][nextY] == 1) {// 使用破壁queue.offer(new int[]{nextX, nextY, 1});state[nextX][nextY] = 1;} else if (node[2] == 1 && grids[nextX][nextY] == 0) {// 不能再使用破壁;乖乖地按常理走吧。queue.offer(new int[]{nextX, nextY, 0});state[nextX][nextY] = 1;} else {// node[2] == 1 && grids[nextX][nextY] == 1// 不能走state[nextX][nextY] = 1;}}}}System.out.println("----------");}return -1;
}

}

测试类:
int[][] grids = {
{0, 0, 1, 0},
{0, 1, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
};
int[] start = {0, 0};
int[] end = {0, 3};
结果:
3

【算法】机器人走迷宫破壁解法(适用于走迷宫、最短路径算法)-20200412相关推荐

  1. 迪杰斯特拉算法c语言要点,C语言迪杰斯特拉实现最短路径算法要点.doc

    C语言迪杰斯特拉实现最短路径算法要点.doc 数据结构课程设计报告 ----旅游咨询系统设计 目录 一.需求分析- 2 - 二.系统分析- 2 - 三.概要设计- 3 - 一.系统划分- 3 - 二. ...

  2. 迪杰斯特拉算法c语言6,C语言迪杰斯特拉实现最短路径算法.doc

    数据结构课程设计报告 ----旅游咨询系统设计 目录 一.需求分析- 2 - 二.系统分析- 2 - 三.概要设计- 3 - 一.系统划分- 3 - 二.邻接矩阵建立流程图:- 3 - 三.迪杰斯特拉 ...

  3. Johnson 全源最短路径算法 Java实现

    Johnson 全源最短路径算法 Java实现 算法导入 算法核心 复杂度分析 时间复杂度 空间复杂度 代码实现 参考资料 End 算法导入 在之前的文章中,我们讲述了: 经典入门的Dijkstra算 ...

  4. AGV导航中的最短路径算法比较

    在AGV导航中,路径选择是一个重要课题,如果最优路径使用最短路径算法,那可以使用的算法有很多,本文比较了当前流行的最短路径算法,主要有Dijkstra 算法,Floyd算法,A-star算法,Bell ...

  5. Dijkstra最短路径算法——java代码实现

    具体的算法详解可以看这篇博客Dijkstra最短路径算法详解. 这里我利用.txt文件存储了有向加权图中顶点之间的连接关系以及边上的权重,文件格式如下: 代码所构造的有向加权图如下: package ...

  6. 单源路径分支界限java_java单源最短路径算法

    . .. .. . 单源最短路径的 Dijkstra 算法: 问题描述: 给定一... 并 应用贪心法求解单源最短路径问题.环境要求对于环境没有特别要求.对于算法实现,可以自由选择 C, C++, J ...

  7. 【算法】机器人走迷宫(适用于走迷宫、最短路径算法)-20200412

    标题:机器人走迷宫(适用于走迷宫.最短路径算法) 问题描述: 一块矩形方格,含有障碍和可通行格子,求从某一点到另外一点的最短距离?N*M的矩阵: 其中,1代表障碍,0代表可通行:示例:给定二维矩阵 0 ...

  8. 走迷宫-双向bfs解法

    双向bfs适用于知道起点和终点的状态下使用,从起点和终点两个方向开始进行搜索,可以非常大的提高单个bfs的搜索效率 同样,实现也是通过队列的方式,可以设置两个队列,一个队列保存从起点开始搜索的状态,另 ...

  9. 做人类语言谜题的破壁人:百度ERNIE 2.0的突破与创造

    这两天AI圈有一个广受关注的新闻,百度发布了持续学习的语义理解框架ERNIE 2.0,这个模型在1.0版本中文任务中全面超越BERT的基础上,英文任务取得了全新突破,在共计16个中英文任务上超越了BE ...

最新文章

  1. R语言多因素方差分析及评估假设检验
  2. java继承的知识点_Java知识点梳理——继承
  3. linux 5 防火墙,CentOS 5 Linux iptables防火墙的配置
  4. python3.6手册中文版-Python3.6.5标准库 参考文档 完整pdf中文版
  5. 3、4TP之url和路由
  6. 全球及中国第三方供应链管理行业发展状况与规模前景分析报告2022-2027年
  7. OkHttp3 HTTP请求执行流程分析
  8. android陀螺仪测试工具,修改安卓陀螺仪和加速度计的sensor抽象层HAL
  9. hdu3078 建层次树+在线LCA算法+排序
  10. java8 策略模式_Java 8中的策略模式
  11. java处理中文字符串_Java实现读取文章中重复出现的中文字符串
  12. 2 引入失败_苦等2年!总投资2800万!镇江首个民国风商场,来了!
  13. ASP.NET MVC 上传图片到项目目录中的文件夹并显示
  14. Vue.js 基础学习
  15. 加密算法使用(三):用用BASE64
  16. CAD建模软件:BricsCAD 22 for Mac
  17. 从Photoshop无法启动DeNoise AI Mac作为插件的解决办法
  18. 无线网络监控服务器怎么,无线监控系统如何安装?
  19. 开关量模块——一对多无线传输
  20. Gateway—网关服务

热门文章

  1. excel,sumif,vlookup,hlookup,AVEDEV,FREQUENCY 函数等函数的应用
  2. Oracle的grid及ASM
  3. 使用InvalidateRect(rect) 防止图片移动时发生闪烁
  4. BugFree的7种解决方案各自的含义是什么?
  5. 一亩田php,【笔尖】一亩田(诗歌)
  6. 使用ssh-keygen生成公私钥
  7. 网页设计与网站规划 作业19 浮动和定位 网格团购界面
  8. python实现轨迹回放供应_微信小程序实现轨迹回放
  9. java并发编程入门_Java并发编程入门,看这一篇就够了
  10. python的Image模块