前往小程序,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
复制
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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
年年双十一,年年抢不到,自制Python淘宝秒杀抢购脚本,百分百中[通俗易懂]
首先我的思路很简单,就是让“程序”帮我们自动打开浏览器,进入淘宝,然后到购物车等待抢购时间,自动购买并支付。
全栈程序员站长
2022/08/11
1.8K0
年年双十一,年年抢不到,自制Python淘宝秒杀抢购脚本,百分百中[通俗易懂]
淘宝抢购Python脚本
第一步:把想要抢购的商品加进购物车,注意:脚本是对购物车内全部商品进行下单操作,所以不够买的商品最好先从购物车内删除。 第二步:写好Python脚本,在抢购之前运行,并设置好抢购时间。
全栈程序员站长
2022/08/11
2K0
淘宝抢购Python脚本
自动化淘宝秒杀:Selenium WebDriver实战指南
电商促销季,淘宝等平台的秒杀活动总是让人心动不已。然而,面对众多竞争者,手动秒杀的成功率几乎可以忽略不计。本文将带你深入了解如何使用Selenium WebDriver自动化淘宝秒杀操作,大幅提升你的抢购成功率。
LucianaiB
2024/11/26
3350
自动化淘宝秒杀:Selenium WebDriver实战指南
年年双十一,年年抢不到,自制Python淘宝秒杀抢购脚本,百分百中
首先我的思路很简单,就是让“程序”帮我们自动打开浏览器,进入淘宝,然后到购物车等待抢购时间,自动购买并支付。
用户8544541
2022/01/27
1.9K0
年年双十一,年年抢不到,自制Python淘宝秒杀抢购脚本,百分百中
python抢淘宝的东西-Python 实现毫秒级淘宝抢购脚本的示例代码
本篇文章主要介绍了Python 通过selenium实现毫秒级自动抢购的示例代码,通过扫码登录即可自动完成一系列操作,抢购时间精确至毫秒,可抢加购物车等待时间结算的,也可以抢聚划算的商品。
全栈程序员站长
2022/06/29
9880
python 制作淘宝秒杀脚本
因为我这里是Python3环境,自带的又pip,所以安装selenium直接使用pip安装
全栈程序员站长
2022/08/23
1K0
python 制作淘宝秒杀脚本
使用selenium自动秒抢淘宝商品(附详细入门指南)
selenium是一款web自动化测试工具,可以很方便地模拟真实用户对浏览器进行操作,它支持各种主流浏览器:IE、Chrome、Firefox、Safari、Opera等。
派大星的数据屋
2022/04/03
2.8K0
使用selenium自动秒抢淘宝商品(附详细入门指南)
女朋友跟你说晚安之后仍然在线,我用Python制作脚本成功征服
辣条的一个朋友最近跟我诉苦:女朋友沉迷淘宝抢购无法自拔,大晚上不睡觉都在定时抢购,真是败家。
润森
2022/08/18
3180
女朋友跟你说晚安之后仍然在线,我用Python制作脚本成功征服
淘宝自动抢购脚本「建议收藏」
需要安装python环境,安装python环境可参考链接 安装python完后记得配置环境和安装Pycharm编辑器(安装Pycharm可参考)
全栈程序员站长
2022/08/12
5.3K0
淘宝自动抢购脚本「建议收藏」
Python自动抢购脚本,学废了双十一双十二帮女票抢购心爱的礼物,隔壁女孩都馋哭了。
第一步:需要把想要的商品加进购物车( 此脚本是对购物车内全部商品进行下单操作,所以不够买的商品最好先从购物车内删除。)
江一铭
2022/09/21
2.2K0
Python自动抢购脚本,学废了双十一双十二帮女票抢购心爱的礼物,隔壁女孩都馋哭了。
【淘宝】python的淘宝秒杀抢购下单源码参考
疫情如期,隔离还在继续,何时工作是一个头大的问题,最近在看口罩,不少电商平台都有放出口罩,当然,手残党将会也会是一直难以下手,你可能很难抢得到,故找了几个关于python的淘宝秒杀抢购下单源码参考,当然本渣渣测试下单成功,但是准点抢购还是没有成功。
二爷
2020/07/22
4.3K0
【淘宝】python的淘宝秒杀抢购下单源码参考
「不求人」我用Python抢到了人生的第一单
但若想使用Selenium成功调用Chrome浏览器完成相应的操作,我们还需要一个媒介与浏览器对接。小明本次使用的是Chrome浏览器,因此就需要通过ChromeDriver来驱动。
程序员小明
2020/06/24
2.9K0
小猿圈Python之实现京东秒杀功能技
现在电商盛起,活动页面一个接着一个,一般都是抢购、秒杀,看着很刺激吧,这篇文章小编就揭开这些秒杀功能的面纱,带你们看看实际的面貌,让我们学习一下代码吧。
py3study
2020/01/06
1.8K0
python编写淘宝秒杀脚本
Omnibug是一个插件,可以简化web度量实现的开发。检查每个传出请求(由浏览器发送)的模式;如果出现匹配,URL将显示在开发人员工具面板中,并进行解码以显示请求的详细信息。
全栈程序员站长
2022/06/27
1.4K0
python编写淘宝秒杀脚本
淘宝“秒杀”脚本
说是秒杀脚本,但其实根本做不到毫秒级(看很多文章写毫秒级也是跪了)。自己在mac上实测,大约10s左右会收到邮件。用selenium秒杀是不要想了,用作自动提交订单,还算ok。
全栈程序员站长
2022/09/06
2.1K0
淘宝“秒杀”脚本
python基于selenium+cv2
 I.打开pycharm,点击Settings,找到Project Interpreter,点击右边的下拉菜单下的show All...选项
py3study
2020/01/19
7220
应对双11,我帮她写了一个自动下单脚本
本文主要介绍一种定时自动下单的技术实现。脚本为女神而写,希望双十一能帮到她享受更高的优惠,进而看到她的笑容。
后端技术探索
2019/07/19
14.1K0
python+selenium小米商城红米K40手机抢购!
下载地址:http://chromedriver.storage.proxy.ustclug.org/index.html
全栈程序员站长
2022/11/16
7850
python滑动验证码_python编程是啥
程序功能:程序模仿登入京东主页,自动输入帐号和密码,完成滑块验证,最后领取每日签京豆
全栈程序员站长
2022/09/27
4640
网络爬虫 | selenium 爬取动态加载信息
使用selenium实现动态渲染页面的爬取。selenium是浏览器自动测试框架,模拟浏览器,驱动浏览器执行特定的动作,并可获取浏览器当前呈现的页面的源代码,可见即可爬。该工具支持IE浏览器、Mozilla Firefox及Google Chrome等。
数据STUDIO
2021/06/24
1.3K0
推荐阅读
相关推荐
年年双十一,年年抢不到,自制Python淘宝秒杀抢购脚本,百分百中[通俗易懂]
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档