找指定两坐标间的最短距离

这一类 找两点间最短距离的问题一般是使用BFS来解决。

题目描述

给定一个矩阵,x 为坐标起点,即可以用作出发的地方,T 为终点, 即要到达的地方,那么请给出 从 X 出发能到达 T 的最短的路径长度, 以及起点 X 的坐标。

输入:矩阵地图

5 6
X00100
00000X
01T000
0X1010
00000X

输出:一行是最短的路径距离,接着一行是起始点 X 的坐标。

4
0 0 1 5

思路

考虑 BFS

再说一次,广度优先搜索可回答两类问题。

 第一类问题:从节点A出发,有前往节点B的路径吗?(在你的人际关系网中,有芒果销

售商吗?)

 第二类问题:从节点A出发,前往节点B的哪条路径最短?(哪个芒果销售商与你的关系

最近?)

【算法图解】

代码

import java.util.*;// 第二题
/*
5 6
X00100
00000X
01T000
0X1010
00000X4
0 0 1 5*/
public class FindShortestPath {public static void main(String[] args) {Scanner sc = new Scanner(System.in);char[][] board;PddNo2 pdd = new PddNo2();while (sc.hasNext()){String[] nm = sc.nextLine().split(" ");int N = Integer.valueOf(nm[0]);int M = Integer.valueOf(nm[1]);board = new char[N][M];for (int i = 0; i < N; i++) {board[i] = sc.nextLine().toCharArray();}Map<Integer, List<Integer>> res = pdd.getRes(board);Set<Map.Entry<Integer, List<Integer>>> entries = res.entrySet();Iterator it = entries.iterator();//while (it.hasNext()){Map.Entry<Integer, List<Integer>> myres = (Map.Entry<Integer, List<Integer>>) it.next();System.out.println(myres.getKey());List<Integer> list = myres.getValue();for (int i = 0; i < list.size(); i++) {System.out.print(list.get(i));if(i!=list.size())System.out.print(" ");}System.out.println();
//            }}}
}class PddNo2 {public char[][] board;public int N, M;//    public boolean[][] marked;public Map<Integer, List<Integer>> res;public int[][] directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};public int count = 0;public Map<Integer, List<Integer>> getRes(char[][] board) {if (board == null || board.length == 0 || board[0].length == 0)return res;// 默认升序排序this.res = new TreeMap<>();this.board = board;this.N = board.length;this.M = board[0].length;List<Integer> list;Queue<int[]> queue = new LinkedList<>();for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {if (board[i][j] == 'X') {//                    System.out.println("起点 "+" x -> "+i+" y -> "+j);queue.clear();queue.add(new int[]{i, j});list = BFS(queue, i, j);if (list != null && list.size() != 0) {int key = list.get(0).intValue();if (res.containsKey(key)) {List temp = res.get(key);temp.add(list.get(1));temp.add(list.get(2));} else {List<Integer> temp = new ArrayList<>();temp.add(list.get(1));temp.add(list.get(2));res.put(key, temp);}}}}}return res;}// list 存储 [length, newX, newY] 表示 (i,j) 到 (newX, newY)的路径长度 lengthpublic List<Integer> BFS(Queue<int[]> queue, int i, int j) {// 这里必须要 创建新的 visited 访问表 因为 每一个起始点开始, 都是全新的路程 这里不会和之前的结果产生联系boolean[][] visited = new boolean[N][M];// 这个路径表 是用来记录每一 从 (i,j) 为起点的到自己这里的路径长度// 使用一个新的路径长度表记录int[][] gridLen = new int[N][M];// 起始点到自己的 路径长度为 0gridLen[i][j] = 0; // 起点List<Integer> res = new ArrayList<>();while (!queue.isEmpty()) {// 移除队列头部的坐标int[] xy = queue.remove();// 作为起点int length = gridLen[xy[0]][xy[1]];visited[xy[0]][xy[1]] = true;for (int k = 0; k < 4; k++) {int newX = xy[0] + directions[k][0];int newY = xy[1] + directions[k][1];if (!inArea(newX, newY) || board[newX][newY] == '1' || visited[newX][newY])continue;queue.add(new int[]{newX, newY});gridLen[newX][newY] = length + 1;if (board[newX][newY] == 'T') {res.add(gridLen[newX][newY]);res.add(i);res.add(j);return res;}}}return null;}public boolean inArea(int x, int y) {return x >= 0 && x < N && y >= 0 && y < M;}
}

BFS 寻找矩阵中两点之间的最短距离相关推荐

  1. 弗洛伊德(Floyd)算法之两点之间的最短距离问题

    1.概述 (1)与迪杰斯特拉(Dijkstra)算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,该算法 名称以创始人之一.1978 年图灵奖获得者.斯坦福大学计 ...

  2. 两点之间的最短距离是?

    两点之间的最短距离是直线吗?现实告诉我们两点之间的最段距离是阻力最小的路:) "世事洞明皆学问,人情练达即文章" 转载于:https://www.cnblogs.com/Maste ...

  3. 一些值得记录的题目(将数组中相同的数据删除、判断n 阶方阵是否对称、寻找矩阵中的马鞍点、将前面各数顺序后移 m 位,最后 m 个数变成最前m 个数并输出、将一长整型数转换为十六进制,以字符串形式输出)

    1.设数组中的数据已经按照由小到大的顺序存放,请将数组中相同的数据删除,仅保留一个,然后以每行3个输出数组元素. #include<stdio.h> int main() {int arr ...

  4. Dijkstra最短路由算法,求任意两点之间的最短距离【Java】

    一.问题 求下图中节点0到节点5之间的最短距离 二.方法 Dijkstra最短路由算法.本文不再赘述,直接上代码,如果不懂,可以参考 文章 三.代码 public class MyDijkstra { ...

  5. 无向图中两点之间的距离_自然语言处理中距离计算总结

    距离计算在自然语言处理中得到广泛使用,不同距离计算方式应用与不同的环境,其中也产生了很多不同的效果. 1 余弦距离 余弦夹角也可以叫余弦相似度.集合中夹角可以用来衡量两个向量方向的差异,机器学习中借用 ...

  6. 图:两点之间的最短距离

    文章出处:极客时间<数据结构和算法之美>-作者:王争.该系列文章是本人的学习笔记. 1 问题阐述 像 Google 地图.百度地图.高德地图这样的地图软件,如果想从家开车到公司,你只需要输 ...

  7. 如何求地球上两点之间的最短距离_例谈平行线上两动点之间距离最短问题

    初中几何中有一类关于距离最短的问题,这些问题最终都会转化为"垂线段最短"或"两点之间线段最短".本文就一类平行线上两动点之间距离最短问题,谈谈笔者对此的分析和见 ...

  8. 如何求地球上两点之间的最短距离_初中数学求线段之和最小的问题,知识点题型汇总...

    我们经常在考试当中看到求线段之和最小的问题,首先来看下这几个数学模型: 模型1:两点之间线段最短 要在l找点P,使得PA+PB最短,这模型最简单,两点之间线段最短. 模型2:将军饮马问题 在l上找一点 ...

  9. 迪杰斯特拉(Dijkstra)算法之两点之间的最短距离问题

    1.概述 (1)与弗洛伊德(Floyd)算法一样,迪杰斯特拉(Dijkstra)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,主要特点是以出发点为中心向外层层扩展(广度优先搜索思想),直到扩 ...

最新文章

  1. 发现服务内存中free部分很小,available部分很大,应该怎么办
  2. mysql sha1prng_Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException | 学步园...
  3. React入门---事件与数据的双向绑定-9
  4. Android学习笔记(五)——数据存储(二)SQLite和ContentProvider
  5. 神经网络有什么理论支持? 本文作者:AI研习社 2017-11-08 18:30 导语:问:神经网络有什么理论支持? 答:目前为止(2017 年)没有什么特别靠谱的。 雷锋网按:本文原作者袁洋
  6. shiro 散列加盐(salt) 次数的效果
  7. TypeScript Non-null Assertion Operator 非空断言操作符 - 感叹号
  8. 在CKEditor中创建自己的命令按钮
  9. 设计高性能大并发WEB系统架构注意点
  10. CFEducational Codeforces Round 66题解报告
  11. 微信小程序 上传图片失败
  12. python开发一般用什么工具,最常用的python开发工具
  13. 华为U8818 刷入Recovery教程+刷机
  14. python代码画人物_Python绘制可爱的卡通人物 | 【turtle使用】
  15. PAT乙级1033题解
  16. 第十四届蓝桥杯第三期模拟赛 C/C++ B组 原题与详解
  17. Unity 检测手机性能,区分高中低端机型
  18. linux 读取 SOC寄存器(物理内存)的机制方法
  19. APIO2018 新家
  20. spring aop切入点汇总

热门文章

  1. XDOJ 233/237-字符串复制
  2. Unraid 安装 ZeroTier 实现外网远程操作
  3. 中国生物降解塑料行业“十四五”发展规划及未来前景展望报告2021年版
  4. php通过udp上报日志,PHP日志扩展SeasLog-1.6.0,支持TCP,UDP发送
  5. 统计公司员工喜欢吃的水果,并打印出最喜欢吃的前K中水果【map关联式容器,k/V结构】
  6. python实现克莱姆法则
  7. python numpy是什么_Python库Numpy里ndarray.ndim 是什么意思?
  8. jre包括jvm和java核心类库_JDK、JRE、JVM分别是什么及它们之间的有什么关联
  9. 初学Singleton单例模式
  10. 关于深度学习云服务器推荐