算法题:按图找最近的路(js/python3)

2023-05-16

题目描述:
有一张 m*n 的地图,地图描述了起点和终点的位置,也描述了两点间分布的高山湖泊,高山湖泊挡住去路,需要绕道行走,请问从起点到终点的最短路径距离是多少?
注意: 走动路线只能上下左右,不能斜着走。
解法:回溯法
js版本:

var findRoute = function(start, end, grid) {
    let m = grid.length, n = grid[0].length;
    if(m === 1 && n === 1) return;
    let visited = new Array(m).fill(0).map(() => new Array(n).fill(0));
    let res = [];
    let choice = [[-1, 0],[1, 0],[0, 1],[0, -1]];
    const dfs = (cur, visited, step) => {
        let [x, y] = cur;
        if(grid[x][y] === 1) return;
        if(x === end[0] && y === end[1]){
            res.push(step);
            return;
        }
        for(let item of choice){
            let dx = x + item[0], dy = y + item[1];
            if(dx < m && dx >= 0 && dy >= 0 && dy < n){
                if(visited[dx][dy] === 1) continue;
                visited[dx][dy] = 1;
                dfs([dx, dy], visited, step+1);
                visited[dx][dy] = 0;
            }
        }
    }
    dfs(start, visited, 0);
    res.sort((a, b) => a - b);
    return res[0];
}

python3版本:

    def demo(self, grid, start, end):
        '''
        按图找最近的路
        '''
        m, n = len(grid), len(grid[0])
        # 只有一个格子,直接退出
        if m == 1 and n == 1:
            return 0
        # 表示是否已访问过。0:未访问;1:已访问。
        visited = [[0 for _ in range(m)] for _ in range(n)]
        # 存放从起点到终点的所有可能步数
        result = []
        
        def bfs(current, visited, step):
            '''
            回溯
            current:当前的坐标
            visited:记录已访问的数组
            step:从起点到当前坐标所用的步数
            '''
            x, y = current
            # 如果是湖泊就直接返回
            if grid[x][y] == 1:
                return
            # 判断到达目的地
            if x == end[0] and y == end[1]:
                # 直接将结果存下(这里可以做优化)
                result.append(step)
                # 直接返回,后续操作不需要执行
                return

            # 遍历四个方向
            for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
                # 计算出遍历后的新坐标
                nx, ny = x + dx, y + dy
                # 保证新坐标不超出二维数组范围
                if 0 <= nx < m and 0 <= ny < n:
                    # 如果新坐标在之前已经被访问过,就跳过
                    if visited[nx][ny] == 1:
                        continue
                    # 否则可以进入回溯
                    # 将当前坐标标记为已访问
                    visited[nx][ny] = 1
                    # 进入回溯,注意部署step要+1
                    bfs((nx, ny), visited, step+1)
                    # 撤销标记,重回未访问
                    visited[nx][ny] = 0

        # 执行回溯算法
        bfs(start, visited, 0)
        # 上面得到的结果是乱序的,为了获得最小步数,这里执行升序排序
        # (如果上面做了优化,这步其实不需要)
        result.sort()
        # 返回结果
        # 数组的count方法可以获得指定元素的数量
        return result[0]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

算法题:按图找最近的路(js/python3) 的相关文章

  • Cesium标注实体【Entity】增、删、改、查

    实体实例将多种形式的可视化聚合到一个高级对象中 它们可以手动创建并添加到 Viewer entities 或由数据源生成 xff0c 例如 CzmlDataSource 和 GeoJsonDataSource 一 Entity 增加 方法一
  • hdu1085(生成函数)

    题目 我终于会用对拍器了 xff0c 我总是不敢去尝试新事物 xff0c 去年就像学 xff0c 上网搜过几次资料 xff0c 感觉烦就放弃了 xff0c 但事实证明其实非常简单 xff0c 对于我未来的coding生活来说实在是大有裨益
  • sumo osmWebWizard.py不生成OSM.sumocfg

    osmWebWizard在确定地图范围和车辆数 xff0c 点击Generate Scenario选项后 生成文件只含有osm netccfg和osm polycfg xff0c 如图 xff1a 主要原因是 当前版本默认仅勾选Add Po
  • vue封装Axios

    Axios的封装 安装axios npm install axios span class token punctuation span span class token comment 安装axios span 引入 一般在项目的src目
  • docker学习笔记(一)—— ubuntu16.04下安装docker

    本文开发环境为Ubuntu 16 04 LTS 64位系统 xff0c 通过apt的docker官方源安装最新的Docker CE Community Edition xff0c 即Docker社区版 xff0c 是开发人员和小型团队的理想
  • Centos7 安装teamviewer

    需求 需要在centos7服务器上安装最新的centos7 一 前期准备 下载teamviewer安装包 xff1a teamviewer官网 使用xftp把下载的文件传到服务器对应的文件夹中 二 安装步骤 启动前准备环境 1 关闭防火墙
  • 字典序最大的子序列(维护单调栈)

    题意 xff1a 找到给出序列的字典序最大的子序列 思路 xff1a 维护单调栈即可 代码 xff1a span class token macro property span class token directive keyword i
  • C++(7-8章)笔记

    第七章 函数 C 43 43 的编程模块 7 xff0e 1函数 1 xff0c 函数如何返回值的 xff1f 答 xff1a 函数通过将返回值复制到指定的cpu寄存器或内存单元中来将其返回 随后 xff0c 调用程序将查看该内存单元 返回
  • 2020/2/20

    区域赛复现 xff1a 1小时 C 43 43 两章 xff1a 3小时 https www cnblogs com yrz001030 p 12340003 html 补了区域赛一题 xff1a 1小时 几何基础 43 2题 xff1a
  • 图论总结

    https www cnblogs com nervendnig p 9151437 html https www cnblogs com zhsl p 3271754 html
  • 使用栈实现进制转换

    使用栈实现进制转换 题目描述 使用栈将一个很长 xff08 gt 30 xff09 的十进制数转换为二进制数 分析 xff1a 此处虽然讲了用栈操作 xff0c 但是很明显我们可以不用 xff0c 直接用数组保存 当然用栈也一样 通过分析
  • 奇怪的棋盘

    题目描述 CC喜欢下棋 xff0c 她有一天去商店发现有很多很奇怪的棋盘 xff0c 那些棋盘的长宽不一样 xff0c 宽永远是2 xff0c 然后长有从1 n等等 然后那个商店还卖很奇怪的棋子 xff0c 都是1 2的大小 xff0c C
  • 萝卜的冒泡排序

    题目描述 萝卜上次已经说过要给各位同学出一道冒泡排序 xff0c 那么此题就以冒泡排序为主吧 xff0c 可是实验室的学长学姐觉得学弟学妹们都很厉害 xff0c 所以就加了各种各样的条件 xff0c 最 终萝卜还是选择加一些条件 xff0c
  • 直接插入排序

    直接插入排序 题目描述 利用直接插入排序算法实现线性表的排序 要求输出第k趟排序的结果 例如原来线性表为 xff1a 26 12 25 4 36 15 21 第一趟直接排序排序结果为 xff1a 12 26 25 4 36 15 21 xf
  • 习武之人

    题目描述 Edmondsiu用沙袋练习武术 Edmondsiu希望把沙袋摆在他家豪宅里面 Edmondsiu的豪宅有一个由11的地砖铺成的1n的院子里 Edmondsiu是处女座的 xff0c 所以他要把一个沙袋正好摆在一个地砖上 xff0
  • centos6下安装与配置squid代理

    1 安装squid yum span class hljs keyword install span squid y 2 编辑配置文件 vim etc squid squid conf span class hljs preprocesso
  • 我卢本伟没有开挂!

    题目描述 众所周知 xff0c 卢本伟没有开挂 xff0c 如何验证他没有开挂呢 xff1f 这里我们发现一个算法通过输出d能够证明他有没有开挂 1 xff1a 如果 n 61 0 xff0c 结束算法 2 xff1a find the s
  • 邻接矩阵

    题目描叙 xff1a 无向图的表示方法邻接矩阵 xff0c 需打印到屏幕 有权 分析 xff1a 邻接矩阵的核心思想便是顶点表和边表 我们可以定义一个结构体 xff0c 里面包含一个顶点表 xff08 即一个vexs一维数组 xff09 x
  • 7-15 完全二叉搜索树 (30 分)

    题目描述 xff1a 一个无重复的非负整数序列 xff0c 必定对应唯一的一棵形状为完全二叉树的二叉搜索树 本题就要求你输出这棵树的层序遍历序列 输入格式 xff1a 首先第一行给出一个正整数 N xff08 1000 xff09 xff0
  • 7-14 最短工期 (25 分)

    题目描述 xff1a 一个项目由若干个任务组成 xff0c 任务之间有先后依赖顺序 项目经理需要设置一系列里程碑 xff0c 在每个里程碑节点处检查任务的完成情况 xff0c 并启动后续的任务 现给定一个项目中各个任务之间的关系 xff0c

随机推荐