Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2023-03-04:定义一个二维数组N*M,比如5*5数组下所示: 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,

2023-03-04:定义一个二维数组N*M,比如5*5数组下所示: 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0,

原创
作者头像
福大大架构师每日一题
发布于 2023-03-04 13:45:23
发布于 2023-03-04 13:45:23
1.2K0
举报

2023-03-04:定义一个二维数组NM,比如55数组下所示:

0, 1, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,

只能横着走或竖着走,不能斜着走,

要求编程序找出从左上角到右下角距离最短的路线。

示例输出:

(0,0) (1,0) (2,0) (2,1) (2,2) (2,3) (2,4) (3,4) (4,4)。

答案2023-03-04:

dijkstra算法。

代码用rust编写。代码如下:

代码语言:rust
AI代码解释
复制
use std::iter::repeat;
fn main() {
    let inputs = vec![
        5, 5, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0,
    ];
    let mut ii = 0;
    let n = inputs[ii];
    ii += 1;
    let m = inputs[ii];
    ii += 1;
    let mut map: Vec<Vec<i32>> = repeat(repeat(0).take(m as usize).collect())
        .take(n as usize)
        .collect();
    for i in 0..n {
        for j in 0..m {
            map[i as usize][j as usize] = inputs[ii];
            ii += 1;
        }
    }
    let mut ans = dijkstra(n, m, &mut map);
    ans.reverse();
    println!("{:?}", ans);
}

// n : n行
// m : m列
// map :
// 0 1 1 1
// 0 0 0 1
// 1 1 0 1
// 0 0 0 0
// list = [0,0] , [1,0], [1,1]...[3,3]
// [3,3] -> [0,0]
fn dijkstra(n: i32, m: i32, map: &mut Vec<Vec<i32>>) -> Vec<Vec<i32>> {
    // (a,b) -> (c,d)
    // last[c][d][0] = a
    // last[c][d][1] = b
    // 从哪到的当前(c,d)
    let mut last: Vec<Vec<Vec<i32>>> = repeat(
        repeat(repeat(0).take(2).collect())
            .take(m as usize)
            .collect(),
    )
    .take(n as usize)
    .collect();

    // int[] arr = {c,d,w}
    //              0 1 距离
    //PriorityQueue<int[]> heap = new PriorityQueue<>((a, b) -> a[2] - b[2]);
    let mut heap: Vec<Vec<i32>> = vec![];

    let mut visited: Vec<Vec<bool>> = repeat(repeat(false).take(m as usize).collect())
        .take(n as usize)
        .collect();
    heap.push(vec![0, 0, 0]);
    let mut ans: Vec<Vec<i32>> = vec![];
    while heap.len() > 0 {
        heap.sort_by(|a, b| a[2].cmp(&b[2]));
        let mut cur = heap.pop().unwrap();
        let x = cur[0];
        let y = cur[1];
        let w = cur[2];
        if x == n - 1 && y == m - 1 {
            break;
        }
        if visited[x as usize][y as usize] {
            continue;
        }
        // (x,y)这个点
        visited[x as usize][y as usize] = true;
        add(
            x,
            y,
            x - 1,
            y,
            w,
            n,
            m,
            map,
            &mut visited,
            &mut heap,
            &mut last,
        );
        add(
            x,
            y,
            x + 1,
            y,
            w,
            n,
            m,
            map,
            &mut visited,
            &mut heap,
            &mut last,
        );
        add(
            x,
            y,
            x,
            y - 1,
            w,
            n,
            m,
            map,
            &mut visited,
            &mut heap,
            &mut last,
        );
        add(
            x,
            y,
            x,
            y + 1,
            w,
            n,
            m,
            map,
            &mut visited,
            &mut heap,
            &mut last,
        );
    }
    let mut x = n - 1;
    let mut y = m - 1;
    while x != 0 || y != 0 {
        ans.push(vec![x, y]);
        let lastX = last[x as usize][y as usize][0];
        let lastY = last[x as usize][y as usize][1];
        x = lastX;
        y = lastY;
    }
    ans.push(vec![0, 0]);
    return ans;
}
// 当前是从(x,y) -> (i,j)
// 左上角 -> (x,y) , 距离是w
// 左上角 -> (x,y) -> (i,j) w+1
// 行一共有n行,0~n-1有效
// 列一共有m行,0~m-1有效
// map[i][j] == 1,不能走!是障碍!
// map[i][j] == 0,能走!是路!
// 把记录加入到堆里,所以得有heap
// last[i][j][0] = x
// last[i][j][1] = y
fn add(
    x: i32,
    y: i32,
    i: i32,
    j: i32,
    w: i32,
    n: i32,
    m: i32,
    map: &mut Vec<Vec<i32>>,
    visited: &mut Vec<Vec<bool>>,
    heap: &mut Vec<Vec<i32>>,
    last: &mut Vec<Vec<Vec<i32>>>,
) {
    if i >= 0
        && i < n
        && j >= 0
        && j < m
        && map[i as usize][j as usize] == 0
        && !visited[i as usize][j as usize]
    {
        heap.push(vec![i, j, w + 1]);
        last[i as usize][j as usize][0] = x;
        last[i as usize][j as usize][1] = y;
    }
}
在这里插入图片描述
在这里插入图片描述

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2023-03-06:给定一个二维网格 grid ,其中: ‘.‘ 代表一个空房间 ‘#‘ 代表一堵 ‘@‘ 是起点 小写字母代表钥匙 大写字母代表锁 我们从起
2023-03-06:给定一个二维网格 grid ,其中:'.' 代表一个空房间'#' 代表一堵'@' 是起点小写字母代表钥匙大写字母代表锁我们从起点开始出发,一次移动是指向四个基本方向之一行走一个单位空间我们不能在网格外面行走,也无法穿过一堵墙如果途经一个钥匙,我们就把它捡起来。除非我们手里有对应的钥匙,否则无法通过锁。假设 k 为 钥匙/锁 的个数,且满足 1 <= k <= 6,字母表中的前 k 个字母在网格中都有自己对应的一个小写和一个大写字母换言之,每个锁有唯一对应的钥匙,每个钥匙也有唯一对应的锁
福大大架构师每日一题
2023/03/06
3990
2023-03-06:给定一个二维网格 grid ,其中: ‘.‘ 代表一个空房间 ‘#‘ 代表一堵 ‘@‘ 是起点 小写字母代表钥匙 大写字母代表锁 我们从起
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值 map[i][j] == 0 表示(i,j)位置是空座 map[i][j] =
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值mapi == 0 表示(i,j)位置是空座mapi == 1 表示(i,j)位置坐了人根据防疫要求,任何人的上、下、左、右,四个相邻的方向都不能再坐人但是为了餐厅利用的最大化,也许还能在不违反防疫要求的情况下,继续安排人吃饭请返回还能安排的最大人数如果一开始的状况已经不合法,直接返回-1比如:1 0 0 00 0 0 1不违反防疫要求的情况下,这个餐厅最多还能安排2人,如下所示,X是新安排的人1 0 X 00 X 0 1再比如
福大大架构师每日一题
2023/01/14
5320
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值 map[i][j] == 0 表示(i,j)位置是空座 map[i][j] =
2023-03-11:给定一个N*M的二维矩阵,只由字符‘O‘、‘X‘、‘S‘、‘E‘组成, ‘O‘表示这个地方是可通行的平地, ‘X‘表示这个地方是不可通行的
2023-03-11:给定一个N*M的二维矩阵,只由字符'O'、'X'、'S'、'E'组成,
福大大架构师每日一题
2023/03/11
8350
2023-03-11:给定一个N*M的二维矩阵,只由字符‘O‘、‘X‘、‘S‘、‘E‘组成, ‘O‘表示这个地方是可通行的平地, ‘X‘表示这个地方是不可通行的
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最快? 来自亚马逊。 答案2022-06-
福大大架构师每日一题
2022/06/16
5560
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最
2023-01-02:某天,小美在玩一款游戏,游戏开始时,有n台机器, 每台机器都有一个能量水平,分别为a1、a2、…、an, 小美每次操作可以选其中的一台机器
第二行为n个正整数a1, a2,...... an,其中ai表示第i台机器初始的能量水平。
福大大架构师每日一题
2023/01/02
3090
2023-01-02:某天,小美在玩一款游戏,游戏开始时,有n台机器, 每台机器都有一个能量水平,分别为a1、a2、…、an, 小美每次操作可以选其中的一台机器
2022-06-17:给定一个数组arr,含有n个数字,可能有正、有负、有0, 给定一个正数k。 返回所有子序列中,累加和最大的前k个子序列累加和。 假设K不大
2022-06-17:给定一个数组arr,含有n个数字,可能有正、有负、有0, 给定一个正数k。 返回所有子序列中,累加和最大的前k个子序列累加和。 假设K不大,怎么算最快? 来自Amazon。 答案
福大大架构师每日一题
2022/06/17
5740
2022-06-17:给定一个数组arr,含有n个数字,可能有正、有负、有0, 给定一个正数k。 返回所有子序列中,累加和最大的前k个子序列累加和。 假设K不大
2022-11-04:给定一个正数n,表示有多少个节点给定一个二维数组edges,表示所有无向边edges[i] = {a, b
[左神java代码](https://github.com/algorithmzuo/weekly-problems/blob/main/src/class_2022_08_2_week/Code02_TreeDye.java)
福大大架构师每日一题
2023/02/01
2300
2022-05-30:给定一个n*2的二维数组,表示有n个任务。 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数
一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数,
福大大架构师每日一题
2022/05/30
2430
2022-05-30:给定一个n*2的二维数组,表示有n个任务。 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数
2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子 你有 n 颗球。箱子的顶部和底部都是开着的。 箱子中的每个单元格都有一个对角
2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子
福大大架构师每日一题
2022/08/26
4790
2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子 你有 n 颗球。箱子的顶部和底部都是开着的。 箱子中的每个单元格都有一个对角
2023-02-13:力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号 它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集
2023-02-13:力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号
福大大架构师每日一题
2023/02/13
3590
2023-02-13:力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号 它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集
2023-10-18:用go语言,给定一个数组arr,长度为n,表示有0~n-1号设备, arr[i]表示i号设备的型号,型号的
2023-10-18:用go语言,给定一个数组arr,长度为n,表示有0~n-1号设备,
福大大架构师每日一题
2023/10/23
3300
2023-10-18:用go语言,给定一个数组arr,长度为n,表示有0~n-1号设备, arr[i]表示i号设备的型号,型号的
2023-05-14:你的赛车可以从位置 0 开始,并且速度为 +1 ,在一条无限长的数轴上行驶,赛车也可以向负方向行驶,赛车可
2023-05-14:你的赛车可以从位置 0 开始,并且速度为 +1 ,在一条无限长的数轴上行驶,
福大大架构师每日一题
2023/06/09
2070
2023-05-14:你的赛车可以从位置 0 开始,并且速度为 +1 ,在一条无限长的数轴上行驶,赛车也可以向负方向行驶,赛车可
2022-06-16:给定一个数组arr,含有n个数字,都是非负数,给定一个正数k,返回所有子序列中,累加和最小的前k个子序列累
[左神java代码](https://github.com/algorithmzuo/weekly-problems/blob/main/src/class_2022_04_1_week/Code06_TopMinSubsquenceSum.java)
福大大架构师每日一题
2023/06/08
3290
2022-06-16:给定一个数组arr,含有n个数字,都是非负数,给定一个正数k,返回所有子序列中,累加和最小的前k个子序列累
2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子你有 n 颗球。箱子的顶部和底部都是开着的。箱
2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子
福大大架构师每日一题
2022/11/06
4140
2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子你有 n 颗球。箱子的顶部和底部都是开着的。箱
2022-11-26:给定一个字符串s,只含有0~9这些字符 你可以使用来自s中的数字,目的是拼出一个最大的回文数 使用数字的个数,不能超过s里含有的个数 比如
力扣2384。统计词频,先从大网校填写一对一对的数据,然后填写剩下的最大的数据,最后组合就是需要的返回值。注意取一对数的时候刚开始不能取0,因为起始为0的数不是回文数。
福大大架构师每日一题
2022/11/26
4010
2022-11-26:给定一个字符串s,只含有0~9这些字符 你可以使用来自s中的数字,目的是拼出一个最大的回文数 使用数字的个数,不能超过s里含有的个数 比如
2022-12-12:有n个城市,城市从0到n-1进行编号。小美最初住在k号城市中 在接下来的m天里,小美每天会收到一个任务 她可以选择完成当天的任务或者放弃该
2022-12-12:有n个城市,城市从0到n-1进行编号。小美最初住在k号城市中
福大大架构师每日一题
2022/12/12
6150
2022-12-12:有n个城市,城市从0到n-1进行编号。小美最初住在k号城市中 在接下来的m天里,小美每天会收到一个任务 她可以选择完成当天的任务或者放弃该
2022-06-20:一个二维矩阵,上面只有 0 和 1,只能上下左右移动, 如果移动前后的元素值相同,则耗费 1 ,否则耗费 2。 问从左上到右下的最小耗费。
1.网上非常流行的方法,但这是错误的。这道题动态规划是做不了的。因为上下左右四个方向都可能走,而不是右下两个方向。
福大大架构师每日一题
2022/06/20
7330
2022-06-20:一个二维矩阵,上面只有 0 和 1,只能上下左右移动, 如果移动前后的元素值相同,则耗费 1 ,否则耗费 2。 问从左上到右下的最小耗费。
2023-02-12:给定正数N,表示用户数量,用户编号从0~N-1, 给定正数M,表示实验数量,实验编号从0~M-1, 给定长度为N的二维数组A, A[i]
Bi = { e, f }表示,第i条查询想知道e号、f号实验,一共有多少人(去重统计)。
福大大架构师每日一题
2023/02/12
6100
2023-02-12:给定正数N,表示用户数量,用户编号从0~N-1, 给定正数M,表示实验数量,实验编号从0~M-1, 给定长度为N的二维数组A, A[i]
2022-12-22:给定一个数字n,代表数组的长度, 给定一个数字m,代表数组每个位置都可以在1~m之间选择数字, 所有长度为n的数组中,最长递增子序列长度为
2022-12-22:给定一个数字n,代表数组的长度,给定一个数字m,代表数组每个位置都可以在1~m之间选择数字,所有长度为n的数组中,最长递增子序列长度为3的数组,叫做达标数组。返回达标数组的数量。1 <= n <= 500,1 <= m <= 10,500 10 10 * 10,结果对998244353取模,实现的时候没有取模的逻辑,因为非重点。来自微众银行。答案2022-12-22:参考最长递增子序列。代码用rust编写。代码如下:use std::iter::repeat;fn main() {
福大大架构师每日一题
2022/12/22
2.4K0
2022-12-22:给定一个数字n,代表数组的长度, 给定一个数字m,代表数组每个位置都可以在1~m之间选择数字, 所有长度为n的数组中,最长递增子序列长度为
2022-12-06:定义一个概念叫“变序最大和“ “变序最大和“是说一个数组中,每个值都可以减小或者不变, 在必须把整体变成严格升序的情况下,得到的最大累加和
2022-12-06:定义一个概念叫"变序最大和" "变序最大和"是说一个数组中,每个值都可以减小或者不变, 在必须把整体变成严格升序的情况下,得到的最大累加和 比如,1,100,7变成1,6,7时,就有变序最大和为14 比如,5,4,9变成3,4,9时,就有变序最大和为16 比如,1,4,2变成0,1,2时,就有变序最大和为3 给定一个数组arr,其中所有的数字都是>=0的。 求arr所有子数组的变序最大和中,最大的那个并返回。 1 <= arr长度 <= 10^6, 0 <= arri <= 10^6。
福大大架构师每日一题
2022/12/06
6420
2022-12-06:定义一个概念叫“变序最大和“ “变序最大和“是说一个数组中,每个值都可以减小或者不变, 在必须把整体变成严格升序的情况下,得到的最大累加和
推荐阅读
2023-03-06:给定一个二维网格 grid ,其中: ‘.‘ 代表一个空房间 ‘#‘ 代表一堵 ‘@‘ 是起点 小写字母代表钥匙 大写字母代表锁 我们从起
3990
2023-01-14:给定一个二维数组map,代表一个餐厅,其中只有0、1两种值 map[i][j] == 0 表示(i,j)位置是空座 map[i][j] =
5320
2023-03-11:给定一个N*M的二维矩阵,只由字符‘O‘、‘X‘、‘S‘、‘E‘组成, ‘O‘表示这个地方是可通行的平地, ‘X‘表示这个地方是不可通行的
8350
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最
5560
2023-01-02:某天,小美在玩一款游戏,游戏开始时,有n台机器, 每台机器都有一个能量水平,分别为a1、a2、…、an, 小美每次操作可以选其中的一台机器
3090
2022-06-17:给定一个数组arr,含有n个数字,可能有正、有负、有0, 给定一个正数k。 返回所有子序列中,累加和最大的前k个子序列累加和。 假设K不大
5740
2022-11-04:给定一个正数n,表示有多少个节点给定一个二维数组edges,表示所有无向边edges[i] = {a, b
2300
2022-05-30:给定一个n*2的二维数组,表示有n个任务。 一个信息是任务能够开始做的时间,另一个信息是任务的结束期限,后者一定大于前者,且数值上都是正数
2430
2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子 你有 n 颗球。箱子的顶部和底部都是开着的。 箱子中的每个单元格都有一个对角
4790
2023-02-13:力扣数据中心有 n 台服务器,分别按从 0 到 n-1 的方式进行了编号 它们之间以「服务器到服务器」点对点的形式相互连接组成了一个内部集
3590
2023-10-18:用go语言,给定一个数组arr,长度为n,表示有0~n-1号设备, arr[i]表示i号设备的型号,型号的
3300
2023-05-14:你的赛车可以从位置 0 开始,并且速度为 +1 ,在一条无限长的数轴上行驶,赛车也可以向负方向行驶,赛车可
2070
2022-06-16:给定一个数组arr,含有n个数字,都是非负数,给定一个正数k,返回所有子序列中,累加和最小的前k个子序列累
3290
2022-08-26:用一个大小为 m x n 的二维网格 grid 表示一个箱子你有 n 颗球。箱子的顶部和底部都是开着的。箱
4140
2022-11-26:给定一个字符串s,只含有0~9这些字符 你可以使用来自s中的数字,目的是拼出一个最大的回文数 使用数字的个数,不能超过s里含有的个数 比如
4010
2022-12-12:有n个城市,城市从0到n-1进行编号。小美最初住在k号城市中 在接下来的m天里,小美每天会收到一个任务 她可以选择完成当天的任务或者放弃该
6150
2022-06-20:一个二维矩阵,上面只有 0 和 1,只能上下左右移动, 如果移动前后的元素值相同,则耗费 1 ,否则耗费 2。 问从左上到右下的最小耗费。
7330
2023-02-12:给定正数N,表示用户数量,用户编号从0~N-1, 给定正数M,表示实验数量,实验编号从0~M-1, 给定长度为N的二维数组A, A[i]
6100
2022-12-22:给定一个数字n,代表数组的长度, 给定一个数字m,代表数组每个位置都可以在1~m之间选择数字, 所有长度为n的数组中,最长递增子序列长度为
2.4K0
2022-12-06:定义一个概念叫“变序最大和“ “变序最大和“是说一个数组中,每个值都可以减小或者不变, 在必须把整体变成严格升序的情况下,得到的最大累加和
6420
相关推荐
2023-03-06:给定一个二维网格 grid ,其中: ‘.‘ 代表一个空房间 ‘#‘ 代表一堵 ‘@‘ 是起点 小写字母代表钥匙 大写字母代表锁 我们从起
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档