- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我喜欢玩 Ticket to Ride ,所以我决定尝试用 Python 实现部分游戏逻辑,作为一个辅助编程项目。游戏板本质上是一个加权多重图,因此用 NetworkX 复制了游戏的基本结构。小菜一碟。
我遇到麻烦的一个部分是分析在给定玩家拥有的火车卡 list 的情况下是否可能通过棋盘的特定路径。我认为它本身更像是一个数学问题而不是编程问题,我可能可以拼凑出一种蛮力方法来解决问题,但我认为必须有一种更有效的方法。
对于那些不了解游戏的人:在任何给定时间,每个玩家都有八种颜色之一的多张火车卡,外加一个特殊的“机车”类别作为通配符。这些颜色对应于游戏板上火车线的颜色 (shown here),灰色线除外,您可以使用任何颜色,只要该段中的所有车厢颜色相同即可。 (有涉及隧道和渡轮的边缘案例,但我们暂时将它们放在一边。)
使用现在的代码,我可以找到两个给定城市之间的所有路径,并返回走那条特定路径需要每种颜色的火车卡数量,除非路径涉及灰色部分。我首先处理非灰色部分,因为它们更直接——要么你有足够的红色/绿色/蓝色卡片用于路径中的每个红色/绿色/蓝色部分,要么你没有。对于灰色,因为您可以选择任何颜色用于每个部分,所以它会更加复杂。
对于只有一个灰色部分的路径,它仍然很容易——要么你有足够的任何一种颜色的卡片来填充它,要么不填充它。但是,对于多个灰色段,可能会遇到这样的情况:为第一个段选择的颜色使得无法完成第二个或第三个段。
举个例子,假设玩家的卡牌库存为 4 红、2 绿、3 蓝,我们想知道他是否可以从巴黎到达维也纳。查看棋盘,很容易看出此卡组合的唯一可能路线是去巴黎 --(3 灰色)--> 苏黎世 --(2 绿色)--> 威尼斯 --(2 灰色)--> Zagrad --(2 灰色)--> 维也纳。我解决这个问题的算法从绿色部分开始,并在那里分配两张绿卡。然后需要决定如何使用剩下的4张红卡和3张蓝卡来覆盖长度为3、2、2的灰色段。
答案当然是使用巴黎和苏黎世之间的 3 张蓝卡,威尼斯到扎格勒和萨格勒到维也纳各使用 2 张红卡。但是,对于涉及更多颜色和更多段的不太明显的情况,如何编写解决此问题的通用算法?
我现在的代码如下所示:
def can_afford(path, cards):
grays = list()
for segment in path:
if segment.color == 'Gray':
grays.append(segment)
else:
if cards.get(segment.color, 0) >= segment.weight:
cards[segment.color] -= segment.weight
else:
return False
for gray in grays:
# Halp!
pass
return True
(“重量”是火车车厢的长度。)
我觉得这里潜伏着一个非常微不足道的解决方案,我无法确定。有什么想法吗?
最佳答案
正如 Daniel Brückner 所说,找到一种方法将卡片颜色分配给灰色段的问题对应于 bin packing problem ,彩色卡片组对应垃圾箱,灰色部分对应待包装的元素。
现在,装箱问题是NP-hard , 但在这种情况下这不是灾难,因为问题可以在 pseudo-polynomial time 中解决。 (也就是说,时间是容器大小的多项式)使用 dynamic programming ,这对您的应用程序来说应该足够好了,其中垃圾箱的大小受游戏中卡片数量的限制。这是装箱的示例实现,使用 @functools.lru_cache
decorator记住它:
从 functools 导入 lru_cache
@lru_cache(maxsize=None)
def packing(bins, objects):
"""Return a packing of objects into bins, or None if impossible. Both
arguments are tuples of numbers, and the packing is returned in
the form of a list giving the bin number for each object.
>>> packing((4,5,6), (6,5,4))
[2, 1, 0]
>>> packing((4,5,6), (1,1,2,4,5))
[0, 0, 0, 1, 2]
"""
if not objects:
return []
o = objects[0]
rest = objects[1:]
for i, b in enumerate(bins):
if o <= b:
p = packing(bins[:i] + (b - o,) + bins[i+1:], rest)
if p is not None:
return [i] + p
return None
这可用于确定是否可以在 Ticket to Ride 中遵循路径:
def can_afford(path, cards):
"""Return True if path can be followed using cards, False if not.
cards might be updated, so pass a copy if you don't want that to
happen.
"""
grays = []
for segment in path:
c, w = segment.color, segment.weight
if c == 'Gray':
grays.append(w)
elif cards.get(c, 0) >= w:
cards[c] -= w
else:
return False
return packing(tuple(cards.values()), tuple(grays)) is not None
请注意,如果您制作了卡片
collection.Counter
, 那么你可以只写 cards[c]
而不是 cards.get(c, 0)
。
关于python - "Ticket to Ride"灰色路线的棋盘游戏逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14483340/
我有两种类型的路由 Public 和 Private。 只有用户登录后才能访问所有私有(private)路由: return tokenService.token ? ( <>
我已按照 Laravel 5.5 文档在我们的应用程序上要求、安装和配置 Laravel Passport。我们仅使用密码授予功能,因为我们不打算将其用作社交登录工具。但是,按照所有说明操作后,我在尝
我想设置事件菜单项的样式,为此我需要将当前 url 与路由进行比较。我知道我可以在 javascript 中做到这一点,但我想知道其他人是如何解决这个问题的。 有什么建议么? 伪代码: My Page
我正在尝试在浏览器上以图形方式显示路径/路线以供客户查看。例如,基于 txt 或 XML 文件,包含说明。 4 90 5 90 2 或 F4,L90,F5,L90,F2 相当于
我创建了一个中间件来阻止我的 laravel 应用程序中的某些路由,但不起作用,无法弄清楚我做错了什么,这是我的代码: ps:我使用的是 laravel 5.2 路线: Route::get('sec
我正在使用 Java 工作。给定一个矩阵 NxM,我需要找到通过该数组的所有可能路径。只允许斜向上或斜向下,或向右斜行。 4x4 矩阵示例: 3 5 7 9 2 4 6 8 9 3 7
我是 Marionette 新手,只是找不到上类路线。 我正在使用 Marionette 的 2.4.1 版本,并尝试以最简单的方式进行操作,以便它能够正常工作。 此代码适用于旧版本的 Marione
我是 AngularJS 的新手。我正在尝试从这个网站( https://docs.angularjs.org/tutorial/step_07 )学习 AngularJS。我的代码如下 index.
我在 yandexmapkit-android 项目上工作。图书馆链接是 https://github.com/yandexmobile/yandexmapkit-android 文档非常薄弱,git
我正在阅读有关 Angular 路由的文档并创建了一个简单的测试: const routes: Route[] = [ { path: '', redirectTo: '/home', pat
我正在开发一项服务 (spring-boot),它获取一个 ID 列表,一个一个地从数据库中获取对象,将这些对象聚合成批处理,然后将它们保存在其他地方。目前,聚合后的批量大小约为 50 个对象,大约每
我正在制作一个网站,在用户登录后,用户将被重定向到主页。网站的主页和所有其他页面只能由登录用户访问,但即使在用户登录后(firebase auth),网站的其余部分( protected 路由)仍然无
我有一个惰性模块,我希望在桌面和移动设备上有不同的体验。基本上我想要我的桌面布局如下: Component1 显示一个列表,用户在列表中选择一个项目,component2 将显示详细信息。我创建了名为
我是 Angular 的新手,我正在尝试让我的路由器工作。基本上我在 / 有一个主页,其中有一个到 /courses 的路由器链接,它运行良好,但是当我重新加载 /courses 时(或输入地址in)
完整的 Mojolicious 应用程序有 routes将转储应用程序路由的命令: script/my_app.pl routes 我如何从 Lite 的测试脚本中做同样的事情应用? use Mojo
我有一个 Camel 2.13.1 应用程序,它使用我通过 CXF 组件访问的外部 Web 服务。我使用 Spring XML 路由元素的 startupOrder 属性来确保在我设置为在启动时调用一
我们有一个在 Karaf 2.4.3 和 Camel 2.15.3 上运行的数据处理应用程序。 在这个应用程序中,我们有一堆导入数据的路由。我们有一个管理 View ,其中列出了这些路由以及每条路由的
我正在尝试组合一个应用程序,我可以在其中查询谷歌路线服务,存储结果以建立缓存,然后根据需要呈现路线。 我可以取回方向数据并将其存储在数据库中就好了,这一切都很好,现在当我在 map 上渲染方向时,我的
我根据 Ryan Bates 的 railscast 使用设计登录创建了一个新项目. 它没有注册路线(与我之前制作的项目不同,步骤完全相同) This image显示了两个“rake 路由”命令。顶
我发现 Google Maps API 通过以下方式支持路线: var map; var directionsPanel; var directions; function initialize()
我是一名优秀的程序员,十分优秀!