力扣(LeetCode)353. 贪吃蛇(2022.12.20)

news2025/1/21 10:18:25

请你设计一个 贪吃蛇游戏,该游戏将会在一个 屏幕尺寸 = 宽度 x 高度 的屏幕上运行。如果你不熟悉这个游戏,可以 点击这里 在线试玩。

起初时,蛇在左上角的 (0, 0) 位置,身体长度为 1 个单位。

你将会被给出一个数组形式的食物位置序列 food ,其中 food[i] = (ri, ci) 。当蛇吃到食物时,身子的长度会增加 1 个单位,得分也会 +1 。

食物不会同时出现,会按列表的顺序逐一显示在屏幕上。比方讲,第一个食物被蛇吃掉后,第二个食物才会出现。

当一个食物在屏幕上出现时,保证 不会 出现在被蛇身体占据的格子里。

如果蛇越界(与边界相撞)或者头与 移动后 的身体相撞(即,身长为 4 的蛇无法与自己相撞),游戏结束。

实现 SnakeGame 类:

SnakeGame(int width, int height, int[][] food) 初始化对象,屏幕大小为 height x width ,食物位置序列为 food
int move(String direction) 返回蛇在方向 direction 上移动后的得分。如果游戏结束,返回 -1 。

示例 1:
在这里插入图片描述

输入:

[“SnakeGame”, “move”, “move”, “move”, “move”, “move”, “move”]
[[3, 2, [[1, 2], [0, 1]]], [“R”], [“D”], [“R”], [“U”], [“L”], [“U”]]

输出:

[null, 0, 0, 1, 1, 2, -1]

解释:

SnakeGame snakeGame = new SnakeGame(3, 2, [[1, 2], [0, 1]]);
snakeGame.move(“R”); // 返回 0
snakeGame.move(“D”); // 返回 0
snakeGame.move(“R”); // 返回 1 ,蛇吃掉了第一个食物,同时第二个食物出现在 (0, 1)
snakeGame.move(“U”); // 返回 1
snakeGame.move(“L”); // 返回 2 ,蛇吃掉了第二个食物,没有出现更多食物
snakeGame.move(“U”); // 返回 -1 ,蛇与边界相撞,游戏结束

提示:

1 <= width, height <= 104
1 <= food.length <= 50
food[i].length == 2
0 <= ri < height
0 <= ci < width
direction.length == 1
direction is ‘U’, ‘D’, ‘L’, or ‘R’.
最多调用 104 次 move 方法

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/design-snake-game

方法一:双端队列

C++提交内容:

class SnakeGame {
    deque<pair<int, int>> q;    // 双端队列,存放 <横坐标,纵坐标>
    vector<vector<int>>& food;
    int m, n, foodIdx = 0, score = 0;
public:
    SnakeGame(int width, int height, vector<vector<int>>& food): m(height), n(width), food(food) {
        q.emplace_front(0, 0);
    }
    
    int move(string direction) {
        auto [x, y] = q.front();
        int nx = x, ny = y;
        if (direction == "U") nx -= 1;
        else if (direction == "D") nx += 1;
        else if (direction == "L") ny -= 1;
        else ny += 1;

        if (nx < 0 || nx >= m || ny < 0 || ny >= n) return -1;  // 移动后越界

        if (foodIdx != food.size() && nx == food[foodIdx][0] && ny == food[foodIdx][1]) {
            ++score;    // 分数加1
            ++foodIdx;  // 下一个食物出现
        } else {
            q.pop_back();  // 未吃到食物,队尾坐标弹出
        } 
        
        for (auto &[r, c] : q) { // 检测蛇头是否与身体相撞
            if (nx == r && ny == c) return -1;
        }
        q.emplace_front(nx, ny);    // 将新坐标添加到队头
        return score;
    }
};
/**
 * Your SnakeGame object will be instantiated and called as such:
 * SnakeGame* obj = new SnakeGame(width, height, food);
 * int param_1 = obj->move(direction);
 */

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

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

相关文章

C++中二叉树的递归遍历方法

在《C中二叉树的非递归遍历方法2-1》中提到&#xff0c;二叉树的遍历分为前序遍历、中序遍历、后序遍历和层序遍历四种。要遍历的二叉树如图1所示。 图1 二叉树结构 创建该二叉树的代码请参见《C中二叉树的非递归遍历方法2-1》。 1 前序遍历的递归实现 前序遍历的输出顺序是…

VC2010 的控制台程序中使用 EasyX

以下是在 VC2010 的控制台应用程序中使用 EasyX 的具体步骤&#xff1a; 1. 启动 VC2010&#xff0c;点击菜单 File -> New -> Project...&#xff0c;打开 New Project 对话框&#xff1a; 2. 选择 “Win32 Console Application” 类型的项目&#xff0c;并选择项目所在…

「驱动知识」Linux下RTC时间的读写分析

Linux下RTC时间的读写分析​ 1.1.1 系统时间与RTC时间​ Linux系统下包含两个时间&#xff1a;系统时间和RTC时间。​ 系统时间&#xff1a;是由主芯片的定时器进行维护的时间&#xff0c;一般情况下都会选择芯片上最高精度的定时器作为系统时间的定时基准&#xff0c;以避免…

【我不熟悉的javascript】map和weakmap的区别

map 保存键值对&#xff0c;并且能够记住键的原始插入顺序&#xff0c;任何值(对象或者基本类型)都可以作为一个键或一个值 基本方法有 get, set, has, delete, clear长度 .size迭代 keys, values, extries, forEach可以使用for ...of 迭代任何值(对象或者基本类型)都可以作为…

如何在头条做营销:2022今日头条营销价值洞察报告.pdf(附下载链接)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年11月份热门报告盘点《底层逻辑》高清配图华为2021数字化转型&#xff1a;从战略到执行.pdf华为项目管理金种子培训教材.pdf清华大学256页PPT元宇宙研究报告.pdf&#xf…

nn.AdaptiveAvgPool2d和nn.AvgPool2d的区别

nn.AdaptiveAvgPool2d 功能&#xff1a;该函数与二维平均池化运算类似&#xff0c;区别主要体现在自适应上&#xff0c;对于任何输入大小&#xff0c;输出大小均为指定的HW大小。 nn.AdaptiveAvgPool2d(output_size)output_size&#xff1a;指定的输出大小&#xff0c;可以是…

echarts-for-weixin只显示折线图,其他不显示解决办法

小程序使用echarts-for-weixin展示图表&#xff0c;结果只展示折线图&#xff0c;其他的统统不显示&#xff0c;百度大法一下午终于知道可能是echarts包内只有折线图。 下载好替换搞定&#xff01;

【Vue 快速入门系列】3分钟掌握Vue中插槽的使用与理解

文章目录前言一、常规实现方式二、匿名插槽三、具名插槽四、作用域插槽前言 插槽作用&#xff1a;让父组件可以向子组件指定位置插入html结构&#xff0c;也是一种组件间通信的方式&#xff0c;适用于 父组件 > 子组件 。 插槽分类&#xff1a;默认插槽、具名插槽、作用域插…

docker部署solr+zk集群

在三台服务器上搭建solr集群&#xff0c;具体架构如下所示&#xff1a; 192.168.184.127 solr1/zk1 192.168.184.128 solr2/zk2 192.168.184.129 solr3/zk3 1.安装docker 三台服务器上都执行以下命令 # setenforce 0 # systemctl stop firewall…

代码随想录Day56|583.两个字符串的删除操作 、72.编辑距离、编辑距离总结篇

文章目录583.两个字符串的删除操作72.编辑距离编辑距离总结篇583.两个字符串的删除操作 文章讲解&#xff1a;代码随想录 (programmercarl.com) 题目链接&#xff1a;583. 两个字符串的删除操作 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 给定两个单词 wor…

Flume EmbeddedAgent

flume flume 二次开发&#xff0c;对EmbeddedAgent的简易改造&#xff0c;动态控制agent&#xff0c;实现启动、关闭等功能。 模块结构如下所示&#xff1a; flume-parent github地址 1、用途 1.1、本地调试 对flume不是特别熟悉的开发者&#xff0c;都没有办法一次开发完…

消息队列mq

1. 为什么使用消息队列&#xff1f; 其实就是问问你消息队列都有哪些使用场景&#xff0c;然后你项目里具体是什么场景&#xff0c;说说你在这个场景里用消息队列是什么&#xff1f; 解耦、异步、削峰 2. 消息队列优缺点 2.1.优点 优点上面已经说了&#xff0c;就是在特殊…

并查集的原理及实现

Ⅰ. 并查集原理 在一些应用问题中&#xff0c;需要将 n 个不同的元素划分成一些不相交的集合。开始时&#xff0c;每个元素自成一个单元素集合&#xff0c;然后按一定的规律将归于同一组元素的集合合并。在此过程中要反复用到查询某一个元素归属于那个集合的运算。适合于描述这…

前端基础_线型Line styles

线型Line styles 线型包括如下属性。 lineWidth value lineCap type lineJoin type miterLimit value 通过这些属性来设置线的样式。下面将结合实例来讲解一下各属性的应用及应用后的效果。 lineWidth属性 该属性设置当前绘线的粗细&#xff0c;属性值必须…

ArcGIS编辑绘制图斑又慢又难?这些高效的处理技巧你值得拥有!

GIS画图是不是画得很慢! 图斑修改是不是无从下手! 图纸矢量化是不是琐碎繁杂、工作量大! 其实,强大的ArcGIS有很多高效的图斑编辑技巧,掌握这些技巧,无论是绘制图斑、还是修改图斑,还是图纸矢量化,绝对让你事半功倍! NO.1—自动完成面 当你要绘制一个图斑的相邻图…

华为云桌面,企业云上办公为何都偏好它?

在众多云上办公产品中&#xff0c;华为云桌面基于华为云的三十年投入的技术强、资源多、创新快和更可靠的优势&#xff0c;在众多云上办公产品中脱颖而出&#xff0c;成为众多企业数字化转型道路上不二选择&#xff0c;类似于三一重工、中泰模具、小飞侠等企业都选择了华为云桌…

非递归前序、中序遍历代码推演出后序遍历代码(极其透彻)

一、前言 众所周知&#xff0c;二叉树的遍历方式有三种&#xff1a;前序遍历、中序遍历和后序遍历。 &#x1f34c; 前序遍历&#xff1a;首先访问根节点&#xff0c;然后递归遍历左子树&#xff0c;最后递归遍历右子树。 &#x1f34c; 中序遍历&#xff1a;首先递归遍历左…

pypower的简单应用1

目录 一、背景描述 二、如何打开IEEE30节点并进行潮流计算 三、如何修改已有模型参数 四、完整代码 五、注意事项 pypower与matpower非常类似&#xff0c;可以利用matpower学习pypower&#xff0c;当然也有一些不同之处。下面记录一下应用pypower解决的问题。 一、背景描述…

Java优先队列的代码实现过程详解

1.优先队列定义 普通的队列是一种先进先出的数据结构&#xff0c;元素在队列尾追加&#xff0c;而从队列头删除。在某些情况下&#xff0c;我们可能需要找出队列中的最大值或者最小值&#xff0c;例如使用一个队列保存计算机的任务&#xff0c;一般情况下计算机的任务都是有优先…

《Python程序开发》期末作业

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、题目&#xff1a; 1 .选修课信息(1).xlsx&#xff0c;信息如下&#xff1a; 2 .学生选课信息表.xls&#xff0c;信息如下 3.任务 二、将文件中的信息导入数据库 …