LeetCode·每日一题·874. 模拟行走机器人·哈希

news2024/12/24 4:03:18

作者:小迅
链接:https://leetcode.cn/problems/walking-robot-simulation/solutions/2350184/ha-xi-biao-zhu-shi-chao-ji-xiang-xi-by-x-20cg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

题目

 

示例

 

思路

题目给出一个在点 (0, 0) ,并面向北方的机器人。现在有一个大小为 n 的命令数组 commands 来操作机器人的移动,和一个大小为 m 的障碍物数组 obstacles。现在我们通过 commands 来模拟机器人的移动,并用一个哈希表来存储每一个障碍物放置点。当机器人的指令为向前移动时,我们尝试往前移动对应的次数——若往前一个单位不为障碍物放置点(即不在哈希表中),则机器人向前移动一个单位,否则机器人保持原位不变。

在机器人移动的过程中记录从原点到机器人所有经过的整数路径点的最大欧式距离的平方即为最后的答案。

在代码实现的过程中,对于机器人转向和向前移动的操作,我们可以用一个方向数组 dirs={[−1,0],[0,1],[1,0],[0,−1]} 来现实。若当前机器人的坐标为 (x,y),当前方向的标号为 d,则往前移动一单位的操作为 x=x+dirs[d][0],y=y+dirs[i][1]。向左转的操作为 d=(d+3)mod4,向右转的操作为 d=(d+1)mod4。

代码注释超级详细

代码


typedef struct {//哈希结构
    int key;
    UT_hash_handle hh;
} HashItem; 

HashItem *hashFindItem(HashItem **obj, int key) {
    HashItem *pEntry = NULL;
    HASH_FIND_INT(*obj, &key, pEntry);//查询哈希表中key是否存在
    return pEntry;
}

bool hashAddItem(HashItem **obj, int key) {
    if (hashFindItem(obj, key)) {
        return false;
    }
    HashItem *pEntry = (HashItem *)malloc(sizeof(HashItem));
    pEntry->key = key;
    HASH_ADD_INT(*obj, key, pEntry);//将key存到哈希表中
    return true;
}

void hashFree(HashItem **obj) {
    HashItem *curr = NULL, *tmp = NULL;
    HASH_ITER(hh, *obj, curr, tmp) {//销毁哈希表
        HASH_DEL(*obj, curr);  
        free(curr);
    }
}

int robotSim(int* commands, int commandsSize, int** obstacles, int obstaclesSize, int* obstaclesColSize) {
    int dirs[4][2] = {{-1, 0}, {0, 1}, {1, 0}, {0, -1}};
    int px = 0, py = 0, d = 1;
    HashItem *mp = NULL;
    for (int i = 0; i < obstaclesSize; i++) {//将路障加入哈希表
        hashAddItem(&mp, obstacles[i][0] * 60001 + obstacles[i][1]);
    }
    int res = 0;
    for (int i = 0; i < commandsSize; i++) {//枚举操作,进行模拟
        int c = commands[i];
        if (c < 0) {//转弯
            d += c == -1 ? 1 : -1;
            d %= 4;
            if (d < 0) {
                d += 4;
            }
        } else {//直行
            for (int i = 0; i < c; i++) {//直行c步
                //每一步都判断当前位置是否有路障
                if (hashFindItem(&mp , (px + dirs[d][0]) * 60001 + py + dirs[d][1])) {
                    break;
                }
                px += dirs[d][0];//无路障直行
                py += dirs[d][1];
                res = fmax(res, px * px + py * py);//记录距离最大值
            }
        }
    }
    hashFree(&mp);
    return res;
}


作者:小迅
链接:https://leetcode.cn/problems/walking-robot-simulation/solutions/2350184/ha-xi-biao-zhu-shi-chao-ji-xiang-xi-by-x-20cg/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/772868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【iPaaS干货分享】大型企业都在用的新一代SAP集成方式,你了解吗?

目录 目前企业实现SAP集成的主要方式 一、使用SAP PI/PO实现SAP与外部系统的集成 二、使用自开发方式 SAP新一代集成方式——基于iPaaS SAP连接器 一、分钟级实现SAP系统的集成 二、统一集成接口及安全管理 三、可视化编排改造SAP接口 SAP&#xff08;Systems, Applicatio…

GO语言方法集

实际上,这里 那为什么还要生产包装方法呢?主要是为了支持接口. 接口不能直接使用接收者为值类型的方法.因为我们A(a)接受者是第一个参数,而这个参数是动态派发的,参数放在栈的局部变量,编译器在编译阶段不能确定这个量的大小.而指针平台确定了大小也就确定了.面对这个问题,编译…

如何使用MATLAB软件完成生态碳汇涡度相关监测与通量数据分析

MATLAB MATLAB是美国MathWorks公司出品的商业数学软件&#xff0c;用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人&#xff0c;控制系统等领域。 [1] MATLAB是matrix&laboratory两个词的组合&#xff0c;意为矩阵工厂&a…

Java List集合 -- 最常用的两种排序方法

现在有一个类 public class Person {private int id;private int age;private String name;public Person(int id, int age, String name) {this.id id;this.age age;this.name name;}public int getId() {return id;}public int getAge() {return age;}public String getN…

149206-86-0,DOTA GGGA,双功能螯合物,修饰在多肽上的螯合剂

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 规格单位&#xff1a;g |货期&#xff1a;按照具体的库存进行提供 | 纯度&#xff1a;95%| PART1-------试剂描述&#xff1a; 螯合剂Dota-ggga&#xff08;CAS号&#xff1a;149206-86-0&#xff09;&#xff0c;螯合…

skbuff.h在哪

今天看来下底层socket的实现&#xff0c;发现很多人都说有个skbuff结构&#xff0c;我就想着去找下这个&#xff0c; cat /include/linux/skbuff.h 结果找不到&#xff0c;查了下&#xff0c;需要下载内核源码 //Ubuntusudo apt install linux-headers-genericdpkg -S skbuff.…

Linux系统配置Node.js环境详细教程(图文讲解)

前言&#xff1a;在使用Jenkins部署Vue项目的时候&#xff0c;如果没有安装Node.js环境的话&#xff0c;Jenkins会无法对Vue项目进行构建&#xff0c;所以本期出了一篇关于在Linux系统如何配置Node.js环境的讲解&#xff0c;以博客的方式记录一下我详细的配置流程和踩过的坑&am…

包的使用及其创建

文章目录 前言类名冲突完整的类路径创建包导入类包总结 前言 java语言中&#xff0c;包在整个管理过程中发挥了重要的作用。使用包&#xff0c;可以有效地管理繁多的类文件&#xff0c;解决了类名重复的问题。在类中应用包和权限修饰符&#xff0c;可以控制他人对类成员的方法的…

旅游卡系统加盟代理软件开发

旅游行业的不断发展&#xff0c;越来越多的旅行社开始推出各种优惠卡来吸引游客。而随着智能手机的普及&#xff0c;开发一款旅行社优惠卡APP软件成为了一种必然的趋势。 该软件的主要功能是提供旅行社的各种优惠卡信息&#xff0c;包括优惠卡的种类、价格、使用范围、有效…

【代码随想录 | Leetcode | 第四天】数组 | 螺旋矩阵 | 螺旋矩阵 II

前言 欢迎来到小K的Leetcode|代码随想录|专题化专栏&#xff0c;今天将为大家带来螺旋矩阵的分享✨ 目录 前言59. 螺旋矩阵 II54. 螺旋矩阵总结 59. 螺旋矩阵 II 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n…

用微服务架构推进企业数字化转型升级

随着数字化转型进入深水区&#xff0c;企业应用程序建设需求急剧增长且变化多端&#xff0c;软件架构经历了单体结构、垂直架构、SOA架构&#xff0c;发展到了现在的微服务架构。 单体架构目前应用较多&#xff0c;部署容易&#xff0c;但单体式应用内部包含了所有需要的服务&…

四、DML-3.数据操作-删除

delete不能删除某个字段的值 若要删除某个字段的值&#xff0c;用update&#xff0c;将该字段设置为null 原数据表&#xff1a; 一、案例一 删除gender为女的员工 delete from employee where gender 女; 步骤一&#xff1a;输入delete命令并执行&#xff1a; 步骤二&#…

【Python】通过第三方库wxauto自动化操作微信电脑客户端

文章目录 一.简介二.wxauto提供的函数1.WxUtils类功能函数&#xff1a;2.WeChat类主要函数&#xff1a; 三.使用四.遇到的问题 一.简介 wxauto是一个Python第三方库&#xff0c;用于自动化操作微信电脑客户端通过wxauto&#xff0c;我们可以使用Python编写脚本&#xff0c;实现…

如何自学网络安全(黑客)

自学网络安全&#xff08;黑客&#xff09;需要掌握一系列的技能和知识&#xff0c;以下是一些学习网络安全的步骤&#xff1a; 基础知识&#xff1a;首先&#xff0c;你需要对计算机网络和操作系统有基本的了解。学习计算机网络的基本原理、网络协议和网络安全的基本概念。同时…

攻防世界-web-easytornado

题目描述&#xff1a;Tornado 框架。打开链接是一个简单的界面 1. 思路分析 看到有个/flag.txt&#xff0c;我们点击进去看下 发现传入了两个参数&#xff0c;一个是filename&#xff0c;还有一个是filehash 看到里面的内容&#xff0c;提示我们真正的flag在 /flllllllllllla…

报错 The server socket has failed to bind to [::] Pytorch中DDP中断训练报错

Pytorch中DDP &#xff1a;The server socket has failed to bind to [::]:29500 (errno: 98 - Address already in use&#xff09;_cv_lhp的博客-CSDN博客 报错如下 The server socket has failed to bind to [::]:999 (errno: 98 - Address already in use) 这个错误是因为…

虚拟机挂载USB设备/USB serial 连接开发板

虚拟机挂载USB设备 1、添加USB设备 2、终端输入&#xff1a;sudo fdisk -l 查看Device设备&#xff1a; 3、创建挂载目录&#xff1a;mkdir /mnt/usb 4、执行挂载命令&#xff1a;sudo mount /dev/sdb1 /mnt/usb ,查看/mnt/usb目录下是否存在U盘中的数据&#xff1a; 5、用…

构建产品帮助中心时要避免的 8 个最常见错误

构建帮助中心是提供给客户和用户有价值信息的重要途径&#xff0c;但在建设过程中&#xff0c;有一些常见的错误需要避免。本文将介绍构建帮助中心时要避免的8个最常见错误&#xff0c;帮助您打造一个更优秀的帮助中心。 1. 以老式方式进行&#xff08;FAQ/Q&A 页面样式&am…

【uni-app】1、分页组件z-paging介绍与使用

1、z-paging 介绍 1、一个 uni-app &#xff08;opens new window&#xff09;分页组件。 2、全平台兼容&#xff0c;支持自定义下拉刷新、上拉加载更多&#xff0c;支持虚拟列表&#xff0c;支持自动管理空数据图、点击返回顶部&#xff0c;支持聊天分页、本地分页&#xff0c…

AI对话+AI绘画,提高你的生产力

智心AI平台 使用 Nestjs 和 Vue3 搭建的 AIGC 生态社区 在线使用&#xff1a;用户端体验 当前特色支持功能 GPT3/4模型支持与控制联网对话支持思维导图生成支持openai DALL-E2绘画支持Midjourney绘画支持全套卡密系统支持在线支付支持完善的后台管理系统支持 源码购买或者…