< 每日算法 - Javascript解析:经典弹珠游戏 >

news2024/10/6 15:30:11

在这里插入图片描述

每日算法 - JavaScript解析:弹珠游戏

  • 一、任务描述:
    • 》 示例一:
    • 》示例二
  • 二、题意解析
  • 三、解决方案:
  • 往期内容 💨

一、任务描述:

欢迎各位来到「力扣嘉年华」,接下来将为各位介绍在活动中广受好评的弹珠游戏。

N*M 大小的弹珠盘的初始状态信息记录于一维字符串型数组 plate 中,数组中的每个元素为仅由 “O”、“W”、“E”、“.” 组成的字符串。其中:

  • “O” 表示弹珠洞(弹珠到达后会落入洞中,并停止前进);
  • “W” 表示逆时针转向器(弹珠经过时方向将逆时针旋转 90 度);
  • “E” 表示顺时针转向器(弹珠经过时方向将顺时针旋转 90 度);
  • “.” 表示空白区域(弹珠按原方向通行)。

游戏规则要求仅能在边缘位置的 空白区域 处(弹珠盘的四角除外)沿 与边缘垂直 的方向打入弹珠,并且打入后的每颗弹珠最多能 前进 num 步。请返回符合上述要求且可以使弹珠最终入洞的所有打入位置。

注意

  1. 你可以 按任意顺序 返回答案。
  2. 若弹珠已到达弹珠盘边缘并且仍沿着出界方向继续前进,则将直接出界。

本题取自 👉 leetcode 👈 秋赛题集

》 示例一:

输入: num = 4 plate = ["..E.",".EOW","..W."]

输出:[[2,1]]

弹珠走动路线: 在 [2,1] 处打入弹珠,弹珠前进 1 步后遇到转向器,前进方向顺时针旋转 90 度,再前进 1 步进入洞中。

效果如下图所示:
在这里插入图片描述

》示例二

输入: num = 5 plate = [".....","..E..",".WO..","....."]

输出:[[0,1],[1,0],[2,4],[3,2]]

弹珠走动路线

  1. 在 [0,1] 处打入弹珠,弹珠前进 2 步,遇到转向器后前进方向逆时针旋转 90 度,再前进 1 步进入洞中。
  2. 在 [1,0] 处打入弹珠,弹珠前进 2 步,遇到转向器后前进方向顺时针旋转 90 度,再前进 1 步进入洞中。
  3. 在 [2,4] 处打入弹珠,弹珠前进 2 步后进入洞中。
  4. 在 [3,2] 处打入弹珠,弹珠前进 1 步后进入洞中。

效果如下图所示:
在这里插入图片描述

二、题意解析

示例图


地形解析如下

  • ① “ O ” 洞口,当弹珠坐标 map[Y][X] === 'O' 时,当次初始坐标弹射的弹珠能够成功抵达洞口。
  • ② “ E ” 地形,使弹珠下次移动方向变化,向原方向的顺时针90°方向移动。如: 原方向为: 上(自下而上)遇到 E地形时,下次将向着 右(自左向右)移动。
  • ③ “ W ” 地形,使弹珠下次移动方向变化,向原方向的逆时针90°方向移动。如: 原方向为: 下(自上而下)遇到 W地形时,下次将向着 右(自左向右)移动。
  • ④ “ . ” 地形,不影响弹珠方向,弹珠下次前进按照原定方向前行。

根据题目,可以思考得出以下条件和限制:

  1. 根据示例可以把传入的 plate 理解成一个倒置的直角坐标轴,也就是一个平面。该地图上,存在 4 种类型的地形,不同地形带来的效果不同。

  2. 弹珠的初始位置规定,只能在地图的边缘空白区域 " . " 发射且不能为地图的四个角,以上面的图片为例,初始点为如上蓝色框框的区域。

  3. 弹珠走向判定,这个是这道算法题的一个小难点。 根据题目,我们可以知道地形对弹珠的影响是以 顺/逆时针 为判定的, 所以,我们需要对方向进行顺序排列且对不同方向前进时,YX坐标的加减情况进行枚举。如下图所示:
    在这里插入图片描述

解题思路①

根据题目可知,由于路径是唯一的,一个入口只会对应一个唯一的出口;一个入口+弹珠进入出口的方向由坐标固定的,可以找到唯一的入口。

因此,指需要筛选出,所有符合规定的出发点,按照指定的弹珠移动逻辑。模拟弹珠行走,即可计算出成功进洞弹珠的入口。

具体逻辑和条件规则,上面也详细讲解了。主要是弹珠移动方向和对应地形造成移动方向变更的问题。

三、解决方案:

该解决方案仅供参考,并非最优解。可以自行发掘,理解算法思维最重要!

/**
 * @param {number} num
 * @param {string[]} plate
 * @return {number[][]}
 */
var ballGame = function(num, plate) {
    // 地图数组
    let _map = plate.map(item => item.split(''))
    // 弹珠位置
    let marbles_Y = Infinity
    let marbles_X = Infinity

    // 地图边界
    let Y_Len = _map.length -1
    let X_Len = _map[0].length -1

    let successInitPoint = []
    let direction = null
    // 对应顺时针: 上右下左的YX加减情况
    let directionEnum = [[-1, 0], [0, 1], [1, 0], [0, -1]]

    for(let Y = 0; Y < Y_Len + 1; Y++) {
        for(let X = 0; X < X_Len + 1; X++) {
            // 限定初始点位置
            if(
                _map[Y][X] == '.' &&
                (Y == 0 || X == 0 || Y == Y_Len || X == X_Len) &&
                [Y, X].toString() != [0, 0].toString() &&
                [Y, X].toString() != [Y_Len, 0].toString() &&
                [Y, X].toString() != [0, X_Len].toString() &&
                [Y, X].toString() != [Y_Len, X_Len].toString()
            ) {
                // 定义弹珠位置
                marbles_Y = Number(Y)
                marbles_X = Number(X)
                // 定义初始方向
                if(Y == 0) direction = 2
                else if(Y == (Y_Len)) direction = 0
                else if(X == 0) direction = 1
                else if(X == (X_Len)) direction = 3

                // 定义步数
                let steps = num
                while(_map[marbles_Y][marbles_X] !== 'O') {
                    if(steps === 0) break
                    
                    // 限定踩到 EW 的逻辑
                    // E为顺时针90度,对应上面定义的枚举值,为索引+1且不能超出索引,故取余数
                    if(_map[marbles_Y][marbles_X] == 'E') direction =  (direction + 1) % 4
                    // W为逆时针90度,对应上面定义的枚举值, 相当于走完一圈再-1(4-1=3),为索引+3且不能超出索引,故取余数
                    else if(_map[marbles_Y][marbles_X] == 'W') direction =  (direction + 3) % 4

                    // 根据上面枚举的方向加减值
                    marbles_Y += Number(directionEnum[direction][0])
                    marbles_X += Number(directionEnum[direction][1])

                    // 判断是否超出边界
                    if(marbles_Y < 0 || marbles_Y > Y_Len || marbles_X < 0 || marbles_X > X_Len) break
                    // 判断结束时, 该弹珠是否成功进洞或者超出边界
                    else if(_map[marbles_Y][marbles_X] === 'O') {
                        successInitPoint.push([Y, X])
                        break
                    }
                    steps -= 1
                }
            } else continue
        }
    }

    // console.log(_map)
    return successInitPoint
};

往期内容 💨

🔥 < 每日算法 - Javascript解析: 交通枢纽 >

🔥 < CSS小技巧:filter滤镜妙用>

🔥 < JavaScript技术分享: 大文件切片上传 及 断点续传思路 >

🔥 < 每日技巧: JavaScript代码优化 >

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

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

相关文章

HSAF实战收获

收获1&#xff1a;MySQL数据类型对应Java类型表格这里的timestamp类型在Java中对应TimeStamp类型&#xff0c;varchar和char都是对饮的String类型收获2&#xff1a;TableFieldTableField(exist false) 注解加载bean属性上&#xff0c;表示当前属性不是数据库的字段&#xff0c…

[golang Web开发] 4.golang web开发:模板引擎

一.简介 使用 Go 的 Web 模板引擎需要以下两个步骤&#xff1a; (1).对文本格式的模板源进行语法分析&#xff0c;创建一个经过语法分析的模板结构&#xff0c;其中模板源既可以是一个字符串,也可以是模板文件中包含的内容 (2).执行经过语法分析的模板&#xff0c;将ResponseWr…

Django User模型

Django User模型用户管理自定义用户模型Django自定义验证引用User模型视图开发创建序列器创建视图创建路由用户注册注册序列化器注册视图注册路由用户管理 在开发登录功能的时候需要数据库来保存用户登录信息和状态&#xff0c;Django中有个内置app 名为 django.contrib.auth …

ICT是什么

信息与通信技术&#xff08;ICT&#xff0c;information and communications technology&#xff09;是一个涵盖性术语&#xff0c;覆盖了所有通信设备或应用软件&#xff1a;比如说&#xff0c;收音机、电视、移动电话、计算机、网络硬件和软件、卫星系统&#xff0c;等等&…

(1)Nginx简介和安装教程

目录 一、下载 二、报错提醒&环境安装 1、安装gcc编译器 2、安装perl库 3、安装 zlib库 4、也可通过命令进行统一安装 三、编译及安装 四、启动并访问 1、启动 2、访问 3、问题排查 五、安装成系统文件 一、下载 官网地址&#xff1a;nginx news Nginx官网提供…

OAuth2入门

1.下载资源 演示代码&#xff1a; OAuth2-example: 演示OAuth2的认证流程https://gitee.com/lisenaq/oauth2-example克隆下载到本地&#xff1a; 导入项目&#xff1a; client 客户 authorization-server 认证服务 resource-owner 资源所有者 resource-server 资源…

儿童台灯哪个品牌更护眼推荐?儿童书桌台灯品牌排行榜

不难发现&#xff0c;近些年我国儿童近视率增长迅速&#xff0c;随着生活条件越来越好&#xff0c;对电子章产品的普及非常广泛&#xff0c;每个家庭的孩子必不可少的就是伏案完成作业&#xff0c;这样的话就需要使用到台灯&#xff0c;选购台灯的时候最好选择适合儿童的专业护…

【算法基础】高精度加法

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前是C语言学习者 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞…

一篇五分生信临床模型预测文章代码复现——FIgure 9.列线图构建,ROC分析,DCA分析 (三)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

axios实战学习——使用高德地图api接口数据实现天气查询案例

文章目录&#x1f4cb;前言&#x1f3af;案例介绍&#x1f9e9;关于高德开发平台1️⃣创建应用生成Key2️⃣查看API文档&#x1f9e9;测试接口&#x1f3af;案例编写&#x1f3af;实现效果&#x1f4cb;前言 关于这个Vue axios 获取接口数据的操作&#xff0c;这篇文章就不过…

UniRx之基础入门

什么是Rx 官方ReactiveX简介&#xff1a; An API for asynchronous programming with observable streams。 通过这句话我们可以得到&#xff1a; 1.首先Rx是个编程接口&#xff0c;不同语言提供不同实现。例如JVM语言中的RxJava。 2.使用场景&#xff0c;异步编程中。 3.基…

路由器 内核开发 流程

宽 带上网已经不是什么新鲜事情&#xff0c;人们对相关的网络器件已经不再陌生&#xff0c;比如说常见的路由器。对于一般的网络用户&#xff0c;他们能知道怎样使用路由器来上网、玩游戏等就 已经感到很满足了&#xff0c;通常情况下对路由器的深层技术很少去过问研究&#xf…

Matlab和PCL中的点云滤波

而在PCL中总结了几种需要进行点云滤波处理的情况&#xff0c;这几种情况分别是&#xff1a; (1)点云数据密度不规则需要平滑。 (2)因为遮挡等问题造成离群点需要去除。 (3)大量数据需要进行“下采样”(Downsample)。 (4)噪声数据需要去除。 对应的解决方法是&#xff1a; (1)按…

什么是ITIL中的变更管理

商业环境和客户期望在不断变化&#xff0c;数字化转型已成为各行各业企业成功的关键因素。数字化转型的关键在于利用可用 应对业务挑战和抓住机遇的技术。当你分解它时&#xff0c;数字化转型基本上是信息技术管理更好地消除有问题的领域&#xff0c;并使您的 IT 基础架构能够应…

WebView缓存机制

一 前言 由于H5具备 开发周期短、灵活性好 的特点&#xff0c;所以现在 Android App大多嵌入了 Android Webview 组件进行 Hybrid 开发 但我知道你一定在烦恼 Android Webview 的性能问题&#xff0c;特别突出的是&#xff1a;加载速度慢 & 消耗流量 今天&#xff0c;我将…

Django 模型的继承

Django 模型的继承项目管理模型关联关系模块的包管理模型的继承项目管理 到目前为止&#xff0c;都是属于httprunner中的用例部分&#xff0c;针对核心功能进行的开发工作&#xff0c;要把平台做成一个用户可以使用的程度还需要些额外的功能&#xff0c;比如项目管理&#xff…

13薪| 8k-14k Java开发工程师

"众推职聘”以交付结果为宗旨的全流程化招聘服务平台&#xff01;今日招聘信息↓工作内容1.参与软件项目和产品概要设计&#xff0c;负责详细功能设计、编码实现及相关文档编写&#xff1b;2.根据模块设计完成相应的模块编码及单元测试&#xff1b;3.对用户行为、需求及反…

zeek集群简述

Zeek不是多线程的&#xff0c;因此&#xff0c;一旦达到单处理器内核的限制&#xff0c;当前唯一的选择就是将工作负载分散到多个内核&#xff0c;甚至多个物理计算机上。Zeek的集群部署场景是构建这些大型系统的当前解决方案。Zeek附带的工具和脚本提供了一种结构&#xff0c;…

自注意力和位置编码(比较卷积神经网络、循环神经网络和自注意力)

在自注意力中&#xff0c;查询、键和值都来自同一组输入。 卷积神经网络和自注意力都拥有并行计算的优势&#xff0c;而且自注意力的最大路径长度最短。但是因为其计算复杂度是关于序列长度的二次方&#xff0c;所以在很长的序列中计算会非常慢。 为了使用序列的顺序信息&…

Nostr with NIP-05 Verification Guide

What is a NIPNIPs (Nostr Implementation Possibilities) document what MUST, what SHOULD and what MAY be implemented by Nostr-compatible relay and client software. See a complete list of nips here.NIP-05 提案是针对用户 Nostr 帐户的验证方法&#xff0c;可以将其…