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

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

出发点坐标[0, 0],终点坐标[2, 3];
java编写int solve(int[][] grids, int[] start, int[] end)返回最短距离;

思路:
(1)机器人在矩阵范围内可以向上下左右走;
(2)终点[2, 3]可以由[2,1]或[1, 3]走来;可在起点到点[2,1]的距离、起点到[1, 3]的距离中取最小值,再加1(格子之间距离为1)即可;
(3)对于算法初学者,自然想到递归;
当然,递归肯定可以解决问题,但是必须要不能找下去再递归回来,太慢了;时间复杂度O(N^2);
(4)另外一种方式呢?从起点给你1步,你能走到起点的上下左右(当上下左右在格子中);扩散1步后,再扩散1步。。。是否可以扩散到终点,这个距离就是最短距离;就像气味扩散一样,

半径是最短距离。能扩散到终点即可,不必求出终点四周的点,再取min值;----算法效率最高;时间复杂度O(N);

2.若要打印最短路径呢?在历史信息中拉出来,已在代码中注释;

3.若机器人有一次清理障碍的机会呢?代码如何写?–下回分解

4.附带经典带权图最短路径的BFS代码;与方格不同的是,带权需要考虑比较权值大小;

Solution.java:
package robot;

import java.util.*;

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

// 方格的dfs
public int dfs(int[][] grids, int[] start, int[] end, Set<List<Integer>> passedPaths) {// 每次递归要new flagPaths, 不然会重用导致程序不正确,切很难定位;兵家大忌;Set<List<Integer>> tmpSet = new HashSet<>(passedPaths);tmpSet.add(Arrays.asList(start[0], start[1]));if ((Math.abs(start[0] - end[0]) == 0 && Math.abs(start[1] - end[1]) == 1)|| (Math.abs(start[0] - end[0]) == 1 && Math.abs(start[1] - end[1]) == 0)) {return 1;}int minLen = 1000;for (int[] item : direct) {int nextX = start[0] + item[0];int nextY = start[1] + item[1];if (nextX >= 0&& nextX <= grids.length - 1&& nextY >= 0&& nextY <= grids[0].length - 1&& grids[nextX][nextY] != 1&& !tmpSet.contains(Arrays.asList(nextX, nextY))) {// 满足要求才能递归:1、坐标在格子中;2、格子不是障碍;3、不能来回走,从某个点走出来的,不能遍历四个方向造成走回去;int len = dfs(grids, new int[]{nextX, nextY}, end, tmpSet);System.out.printf("start to end:%d, %d; %d, %d. -- %d.\n", nextX, nextY, end[0], end[1], len);minLen = Math.min(len, minLen);}}return minLen + 1;
}

// 方格的bfs;
public int bfs(int[][] grids, int[] start, int[] end) {
// 写是否已经访问的状态;
int[][] state = new int[grids.length][grids[0].length];
Queue queue = new LinkedList();
// 注意:若要打印最短路径,必须将历史信息塞入队列;
queue.offer(start);
state[start[0]][start[1]] = 1;
int count = 0;
while (!queue.isEmpty()) {
count++;
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
&& grids[nextX][nextY] != 1 && state[nextX][nextY] != 1) {
queue.offer(new int[]{nextX, nextY});
state[nextX][nextY] = 1;
}
}
}
}
return -1;
}

public int getMinLen(Map<String, List<String>> relMap, Map<List<String>, Integer> valueMap) {Map<String, Integer> pathMap = new HashMap<>();pathMap.put("a", 0);Queue queue = new LinkedList();queue.offer("a");while (!queue.isEmpty()) {String curNode = (String) queue.poll();if (curNode.equals("e")){break;}for (String subNode : relMap.get(curNode)) {List<String> key = Arrays.asList(curNode, subNode);if (null == pathMap.get(subNode)) {pathMap.put(subNode, pathMap.get(curNode) + valueMap.get(key));} else {Integer len = pathMap.get(subNode);pathMap.put(subNode, Math.min(len, pathMap.get(curNode) + valueMap.get(key)));}queue.offer(subNode);}}return pathMap.get("e");
}

}

Main.java
import robot.Solution;

import java.util.*;

public class Main {
public static void main(String[] args){
int[][] grids = {
{0, 0, 1, 0},
{0, 1, 0, 0},
{0, 0, 0, 0},
{0, 0, 0, 0}
};
int[] start = {0, 0};
int[] end = {2, 3};
Set<List> flag = new HashSet<>();
System.out.println(new Solution().dfs(grids, start, end, flag));
System.out.println(new Solution().bfs(grids, start, end));

    /*** 图:* a -> b  权值:4* a -> c  权值:8* b -> d  权值:10* c -> d  权值:2* c -> e  权值:1* d -> e  权值:15*/// 也可以自己用邻接矩阵;Map<String, List<String>> relMap = new HashMap<>();relMap.put("a", Arrays.asList("b", "c"));relMap.put("b", Arrays.asList("d"));relMap.put("c", Arrays.asList("d", "e"));relMap.put("d", Arrays.asList("e"));Map<List<String>, Integer> valueMap = new HashMap<>();valueMap.put(Arrays.asList("a", "b"), 4);valueMap.put(Arrays.asList("a", "c"), 8);valueMap.put(Arrays.asList("b", "d"), 10);valueMap.put(Arrays.asList("c", "d"), 2);valueMap.put(Arrays.asList("c", "e"), 1);valueMap.put(Arrays.asList("d", "e"), 15);System.out.println(new Solution().getMinLen(relMap, valueMap));
}

}

结果:
5
5
9

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

  1. 算法之几个常见的经典最短路径算法

    目录 1. Dijkstra算法 2. Floyd算法 3. Bellman-Ford 算法 1. Dijkstra算法 是解单源最短路径问题的贪心算法. 有一向带权图 G =(V, E),包含右n个 ...

  2. 深入解析最短路径算法

    转载自:http://blog.csdn.net/fengchaokobe/article/details/7478774    第一节 问题的提出及解决方法        所谓最短路径问题,可以说有 ...

  3. 关于最短路径算法的理解

    "最短路径算法:Dijkstra算法,Bellman-Ford算法,Floyd算法和SPFA算法等.​从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径叫做最短路 ...

  4. 最短路径算法——清晰简单的弗洛伊德算法(Floyd)

    弗洛伊德算法(Floyd) \qquad 上一篇文章介绍了迪杰斯特拉算法(Dijkstra).具体请看:最短路径算法--简单明了的迪杰斯特拉算法(Dijkstra).Dijkstra适用于非负权图,并 ...

  5. 最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson,无一幸免

    文章出自:http://dsqiu.iteye.com/blog/1689163 最短路径算法--Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson,无一幸免 本 ...

  6. 计算机网络最短路径路由选择,最短路径算法Dijkstra算法在路由选择中的应用.pdf...

    最短路径算法Dijkstra算法在路由选择中的应用.pdf 计算机与网络 江苏联合职业技术学院徐州机电工程分院 王恒青 江苏联合职业技术学院徐州生物工程分院 宋如敏 [摘要]本文介绍了路由算法的设计目 ...

  7. 最短路径规划论文matlab,最短路径算法及其应用-毕业论文(设计).doc

    湖北大学本科毕业论文(设计) PAGE PAGE II l 湖 北 大 学 本 科 毕 业 论 文 (设 计) 题 目 最短路径算法及其应用 姓 名 学 号 专业年级 指导教师 职 称 年 4月 20 ...

  8. Dijkstra-单源最短路径算法

    Dijkstra-单源最短路径算法 1.算法概述 2.算法实例 3.实战案例 3.1 题目描述 3.2 解题思路与代码实现 1.算法概述   Dijkstra算法用来计算一个点到其他所有点的最短路径的 ...

  9. 【图论算法】最短路径算法(无权最短路径、Dijkstra算法、带负边值的图、无圈图)

    本篇博客将考察各种最短路径问题.     无权最短路径     Dijkstra 算法     具有负边值的图     无圈图     所有顶点对间的最短路径     最短路径的例子–词梯游戏 输入是 ...

最新文章

  1. Python学习笔记:正则表达式
  2. html弧形列表效果,web前端入门到实战:html5网页特效-弧形菜单
  3. Testing BlogJet
  4. 吴恩达机器学习 —— 2.7 计算图
  5. python怎么找一个矩阵_Python(NumPy,SciPy),找到矩阵的零空间
  6. SSM框架之Spring MVC(二)常用注解说明
  7. 段错误原理:Segmentation fault: 11
  8. 旅游后台管理系列——SSM框架Service层整合
  9. Nginx - 原理机制
  10. 商用密码应用安全性评估过程学习指南
  11. 动态电压恢复器(DVR)模型 Matlab/simulink
  12. 春赏百花秋望月,夏沐凉风冬听雪
  13. Axure RP 9 授权码
  14. 【C语言】将十进制数转化为二进制并输出
  15. 什么是CHIP LAN片式网络变压器?片式网络变压器分哪几种?目前应用较多的是哪种片式结构?
  16. 《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(3)
  17. 解决win10状态栏的搜索框无法搜索本地应用或无反应
  18. 计算机ppt翻页笔,ppt翻页笔没反应?这样做就可以。
  19. 课程设计 学生选课管理 王杰 孙乾 蔚晓青
  20. 玩好信用卡,它就是你东山再起的资本

热门文章

  1. Velodyne激光雷达使用教程
  2. 安装Scylla之后出错ImportError: pycurl: libcurl link-time ssl...
  3. 微信生态圈盈利模式分析
  4. linux用户motd,linux需要装?那就和我一起来配置一个动态的MOTD登陆效果吧
  5. 【Rust日报】2022-09-11 Shuttle 创建和部署带有ShuttleSerenity的 Discord 机器人!
  6. HTML5 Canvas自定义圆角矩形与虚线(Rounded Rectangle and Dash Line)
  7. 【matplotlib】图片的各种渲染效果;matplotlib.cm
  8. 常用复原reast.css
  9. [licode cs交互] 4 erizo controller对 android client鉴权通过
  10. SUNDIALS中的RTOL和ATOL