两人网格穿越游戏

2024-01-27

Given a M * N两名玩家的网格和位置p1 and p2在网格上。有 n 个球放置在网格上的不同位置。设这些球的位置为B(1), B(2), B(3) ..., B(n).

我们需要计算曼哈顿最短距离需要挑选所有的球。应按升序挑选球,即如果B(i)之前被挑选过B(j) if i < j.

考虑以下示例案例:
p1 = (1, 1) p2 = (3, 4)让我们将球的位置考虑为B(1) = (1, 1), B(2) = (2, 1), B(3) = (3, 1), B(4) = (5, 5)
Output5因为p1会首先选择B(1), B(2), B(3) and p1会选择B(4)

我的方法
我做了一个greedy approach和计算出的距离p1 and p2从给定的球B(i)(从...开始i = 1 to n)并将最小值添加到输出中并相应地更新玩家的位置。
但这种方法对于很多测试用例来说都失败了。

PS:这个问题是在我过去的一次采访中被问到的O(n)这一问题的解决有望得到解决。

编辑:更多测试用例可以是这样的
p1 = (1,1) p2 = (3,5)
B(1) = (3, 3), B(2) = (1, 1), B(3) = (4, 5), B(4) = (2, 1), B(5) = (4, 3).
在这种情况下p1会选择B(2), B(4) and p2会选择B(1), B(3), B(5)
Output将会是8。

p1 = (1,1) p2 = (3,4)
B(1) = (2, 2), B(2) = (3, 2), B(3) = (4, 2), B(4) = (1, 1)
在这种情况下p1会选择B(4) and p2会选择B(1), B(2), B(3)
Output将是 5。
Note: 当玩家选择一个球时,他会移动到该点.

附言经过讨论我相信不存在线性时间解对于这个问题和O(n^2) 解决方案是可用的最佳解决方案。


我没有线性时间算法。但这里有一个 n² 动态程序:

对于每个时间点(即每个球),您可以选择任何一名球员来接球。我们应该维护的一个有趣的信息是此时其他玩家的位置。所以我们的时间状态Ti由以下任一组成{P1, P2}以及其他玩家的位置。现在,我们希望通过计算下表(使用您的第一个示例)来逐步计算每个时间点和每个可能状态的最小距离:

             T1   T2   T3   T4
----------+--------------------
P1; P2@p2 |  0
P1; P2@B1 |
P1; P2@B2 |
P1; P2@B3 |
P2; P1@p1 |  5
P2; P1@B1 |
P2; P1@B2 |
P2; P1@B3 |

两个初始值是之间的距离p1 and B1 and p2 and B1, 分别。

从每个状态,我们都可以直接前往正确的相邻单元格。这相当于将相应的球员移至新球,并将另一名球员保持在当前位置。成本的变化是当前球和新球之间的距离。

对于每个新专栏,我们在末尾都有一个新条目(对于两名玩家)。这意味着另一名球员拿起了最后一个球,而当前球员可能在任何地方。所以我们要找到当前玩家所有可能位置到当前球的最小距离。我将在这篇文章的末尾对此进行可视化。这样,我们就可以逐列填充整个表格:

示例(再次来自您的问题)

p1 = (1, 1)
p2 = (3, 4) 
B(1) = (1, 1)
B(2) = (2, 1)
B(3) = (3, 1)
B(4) = (5, 5)

DP表:

             T1   T2            T3               T4
----------+---------------------------------------------------------
P1; P2@p2 |  0    0+1=2         1+1=2            2+6=8
P1; P2@B1 |       min(5+1)=6    6+1=7            7+6=13
P1; P2@B2 |                     min(6+2,4+2)=6   6+6=12
P1; P2@B3 |                                      min(7+8,5+8,4+7)=11
P2; P1@p1 |  5   5+1=6          6+1=7            7+6=13
P2; P1@B1 |      min(0+4)=4     4+1=5            5+6=11
P2; P1@B2 |                     min(1+3,6+2)=4   4+6=10
P2; P1@B3 |                                      min(2+3,7+8,6+7)=5

最后一列的最小值是5(即收集所有球的最小距离是 5)。回溯,我们得到:P2@B4,P1@B3,P1@B2,P1@B1。

这是承诺的可视化。为了清楚起见,最后一列的对角线依赖性已被省略:

我不会提供伪代码,因为我很可能会混淆一些索引(导致更多的混乱而不是帮助)。但您应该能够根据上面的描述编写代码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

两人网格穿越游戏 的相关文章

  • Android Studio 在编译时未检测到支持库

    由于 Android Studio 将成为 Android 开发的默认 IDE 因此我决定将现有项目迁移到 Android studio 中 项目结构似乎不同 我的项目中的文件夹层次结构如下 Complete Project gt idea
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • O(1) 算法确定节点是否是多路树中另一个节点的后代?

    想象一下下面的树 A B C D E F 我正在寻找一种方法来查询 F 是否是 A 的后代 注意 F 不需要是directA 的后代 在这种特殊情况下这是正确的 只需要针对更大的潜在后代节点池测试有限数量的潜在父节点 当测试一个节点是否是潜
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • 如何在 Java 中禁用 System.out 以提高速度

    我正在用 Java 编写一个模拟重力的程序 其中有一堆日志语句 到 System out 我的程序运行速度非常慢 我认为日志记录可能是部分原因 有什么方法可以禁用 System out 以便我的程序在打印时不会变慢 或者我是否必须手动检查并
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • 序列化对象以进行单元测试

    假设在单元测试中我需要一个对象 其中所有 50 个字段都设置了一些值 我不想手动设置所有这些字段 因为这需要时间而且很烦人 不知何故 我需要获得一个实例 其中所有字段都由一些非空值初始化 我有一个想法 如果我要调试一些代码 在某个时候我会得
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • 将构造函数添加到 deftype 创建的类中

    为了与 Java 实现互操作性 我需要一个具有执行初始化的空构造函数的类 此类的对象需要具有类似于可变java字段的东西 即该对象代表游戏的后端 并且需要保持游戏状态 deftype 确实一切我想要做except提供一个无效构造函数 因为我
  • 如何检索高质量的指南针方向(如 Google 地图)?

    我发现的所有在 Android 中获取指南针方向的指南都有一个错误 当您以纵向模式握住手机并 看 地平线上方时 指南针箭头会从正确方向旋转 180 度 谷歌地图方向指示器不存在这个问题 谷歌地图的另一个好处是它们可以以某种方式估计指南针的准
  • Vue.js 对数组进行过滤

    我正在尝试使用 vue js 中的计算属性来过滤数组 我想搜索多个字段 名称 状态 标签等 My data events id 1 name Name of event url datetime 2017 05 10T00 00 00Z d
  • 不完整类型的静态字段 - 合法吗?

    在 C 中声明在类定义时不完整的类型的静态字段是否合法 例如 Foo h class Foo public private class Bar static Bar something Foo cpp class Foo Bar Foo B
  • 标准对 char 数组作为模板参数有何规定?

    在我研究答案的过程中这个问题 https stackoverflow com q 57003010 9883438我发现 我之前不知道 gcc 和 clang 允许char如果声明了数组 则它们将成为模板参数static 例如 此代码使用
  • 如何从 ruby​​ 中的反引号命令获取颜色?

    在 ruby 文件中 当我做system rspec file spec rb 我得到一个很好的彩色输出 当我这样做时 result rspec file spec rb puts result 我一点颜色都没有 有什么办法可以保留颜色 顺
  • 过滤文件内容到排序表

    我有一个包含以下代码行的文件 这里的文件显示了一个逐一排序的时间表 at 12 00 the schedule of james version1 is first task eating nothing second task rest
  • Visual Studio 2015(最新更新)发布功能无法编译 ASP.NET Core RC1 源

    几个月前 我开始开发一个新的 ASP NET Core RC1 项目 并使用 Visual Studio 2015 进行发布 生成一个文件夹树 无需项目 C 源代码即可部署 因为它正在将其编译到放入文件夹树的程序集中 现在我已经升级了 Vi
  • 如果 POJO 对象中的可变字段存储在并发HashMap 中,那么该字段是否是线程安全的?

    如果 POJO 对象中的可变字段存储在并发HashMap 中 那么该字段是否是线程安全的 或者我是否需要用锁保护字段或使它们不稳定以确保所有线程都能看到更新 将字段标记为易失性是否足以确保所有线程都能看到更新 如果存储在并发HashMap中
  • java.security.NoSuchAlgorithmException:算法 x25519 不可用

    我收到这段代码的 javax net ssl SSLException 连接重置 ReadableByteChannel rbc Channels newChannel url getInputStream 但仅当在使用 Open JDK
  • Common Lisp:编译与评估

    在带有 sbcl 的 Emacs Slime 上 一旦我在文件中定义了一个函数 或多个 我有两个选择 评估 例如与 C M x eval defun 汇编 例如使用 C c M k 编译文件 第二个也生成一个 fasl 文件 两者有何区别
  • 如何找到带有标题信息的 ELF 文件/图像的大小?

    我需要找到精灵图像的大小进行一些计算 我尝试过在 Linux 上使用 readelf 实用程序 它提供了有关标题和部分的信息 我需要知道精灵的确切文件大小 总体而言 如何从标题信息中找到 ELF 的大小 或者是否有其他方法可以在不读取完整图
  • Java with ajax - ERR_EMPTY_RESPONSE - 服务器处理请求时 Ajax 响应抛出错误

    我在浏览器控制台中收到以下错误 无法加载资源 net ERR EMPTY RESPONSE 我的 ajax 调用适用于所有按钮点击 但是这个error仅用于一个按钮 可以说testExt按钮 单击这些按钮时 后台脚本将运行并执行一些测试 唯
  • 在 PHP 中将实例方法作为参数传递

    我想创建一个监听器类 class Listener var listeners array public function add callable function this gt listeners function public fu
  • Android应用程序中限时启用按钮

    这是一个示例 我希望能够在用户操作后在有限的时间内 假设 30 分钟 启用我的应用程序中的按钮 30 分钟后 此按钮将再次禁用 在 Android 中实现这一目标的最佳方法是什么 因为用户可能会重新启动设备或关闭应用程序 所以我不能简单地使
  • 如何使 LibGDX 桌面默认全屏显示

    我想知道如何使我的桌面应用程序在启动时全屏显示 我是 LibGDX 的新手 非常感谢任何帮助 谢谢 只需定义fullscreen你的领域LwjglApplicationConfiguration LwjglApplicationConfig
  • 使用 @require_POST 时如何在 Django 中显示 HTTP 状态 405(不允许的方法)的自定义错误页面

    我的问题很简单 当使用 Django 时 如何显示 HTTP 状态 405 方法不允许 的自定义错误页面 require POST装饰师 我正在使用django views decorators http require POST装饰器 当
  • 将 GregorianCalendar 与 SimpleDateFormat 结合使用

    因此 我一直在绞尽脑汁地思考这个 应该是 简单的练习 以使程序将日期字符串转换为GregorianCalendar对象 格式化它 完成后再次以字符串形式返回 这是程序的最后一点 它从文件中获取大量文本 将其分解为单独的记录 然后将记录分解为
  • 如何检查 ArrayList 是否包含另一个 ArrayList 的任何元素? [复制]

    这个问题在这里已经有答案了 有没有办法确定 ArrayList 是否包含不同 ArrayList 的任何元素 像这样 list1 contains any element of list2 正在循环遍历所有元素list2并一一检查元素是唯一
  • 两人网格穿越游戏

    Given a M N两名玩家的网格和位置p1 and p2在网格上 有 n 个球放置在网格上的不同位置 设这些球的位置为B 1 B 2 B 3 B n 我们需要计算曼哈顿最短距离需要挑选所有的球 应按升序挑选球 即如果B i 之前被挑选过