- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在为基于图 block 的游戏编写随机关卡生成器时遇到了一个有趣的问题。我已经为它实现了一个强力求解器,但它的速度呈指数级下降,而且绝对不适合我的用例。我不一定要寻找完美的解决方案,我会对性能良好的“足够好”的解决方案感到满意。
问题陈述:
假设您有以下可用图 block 的全部或部分(这是映射到右、上、左和下方向的所有可能的 4 位模式的组合):
alt text http://img189.imageshack.us/img189/3713/basetileset.png
为您提供了一个网格,其中一些单元格被标记 (true),而其他单元格未标记 (false)。例如,这可以由柏林噪声算法生成。目标是用瓷砖填充这个空间,以便有尽可能多的复杂瓷砖。理想情况下,所有瓷砖都应该连接起来。某些输入值(可用图 block + 图案)可能没有解决方案。如果左上角未连接的图 block 可用(即,所有图案单元格都可以用该图 block 填充),则始终至少有一个解决方案。
示例:
图像从左到右:瓷砖可用性(可以使用绿色瓷砖,不能使用红色瓷砖)、要填充的图案和解决方案
alt text http://img806.imageshack.us/img806/2391/sampletileset.png + alt text http://img841.imageshack.us/img841/7/samplepattern.png = alt text http://img690.imageshack.us/img690/2585/samplesolution.png
我尝试了什么:
我的蛮力实现尝试了所有可能的瓷砖,并跟踪找到的解决方案。最后,它选择最大化从每个图 block 传出的连接总数的解决方案。它花费的时间与图案中的瓷砖数量成指数关系。 12 block 瓷砖的图案需要几秒钟才能解决。
注意事项:
正如我所说,性能比完美更重要。但是,最终解决方案必须正确连接(没有指向未指向原始图 block 的图 block 的图 block )。为了给出范围的概念,我想在大约 2 秒内处理 100 个图 block 的图案。
最佳答案
对于 100-tile 实例,我相信基于输入图雕刻分解的动态程序可以满足要求。
雕刻分解
在图论中,图的雕刻分解是其顶点的递归二元划分。例如,这是一个图表
1--2--3
| |
| |
4--5
及其雕刻分解之一
{1,2,3,4,5}
/ \
{1,4} {2,3,5}
/ \ / \
{1} {4} {2,5} {3}
/ \
{2} {5}.
雕刻分解的宽度是离开其分区之一的边的最大数量。在这种情况下,{2,5}
有出边2--1
, 2--3
, 和 5--4
, 因此宽度为 3。10 x 10 网格的 kd 树式分区的宽度为 13。
图的雕刻宽度是雕刻分解的最小宽度。已知n个顶点的平面图(特别是网格图的子图)的雕刻宽度为O(√n),大O常数相对较小。
动态程序
给定一个 n 顶点输入图和一个宽度为 w 的雕刻分解,有一个 O(2w n) 时间的算法来计算最佳图 block 选择。此运行时间在 w 中快速增长,因此您应该尝试手动分解一些样本输入,以了解预期的性能。
该算法自下而上地作用于分解树。令 X 为分区,令 F 为离开 X 的边集。我们制作一个表,将 F 中存在或不存在边的 2|F| 种可能性映射到最佳总和在指定约束下的 X 上(-Infinity 如果没有解决方案)。例如,分区 {1,4}
, 我们有条目
{} -> ??
{1--2} -> ??
{4--5} -> ??
{1--2,4--5} -> ??
对于只有一个顶点的叶子分区,F 的子集完全决定了瓦片,因此很容易填写连接数(如果瓦片有效)或 -Infinity 否则。对于其他分区,在计算表的条目时,为两个 child 之间的边尝试所有不同的连接模式。
例如,假设我们有棋子
|
. .- .- -. .
|
{1}
的表格是
{} -> 0
{1--2} -> 1
{1--4} -> -Infinity
{1--2,1--4} -> 2
{4}
的表格是
{} -> 0
{1--4} -> 1
{4--5} -> 1
{1--4,4--5} -> -Infinity
现在让我们计算 {1,4}
的表.对于 {}
, 没有边缘 1--4
{1}
得分为 0 (条目 {}
)为 {4}
加分 0 (条目 {}
)。带边1--4
我们有分数 -Infinity + 1 = -Infinity(条目 {1--4}
)。
{} -> 0
对于 {1--2}
, 分数为 1 + 0 = 1 没有 1--4
和 2 + 1 = 3 与。
{1--2} -> 3
继续。
{4--5} -> 0 + 1 = 1 (> -Infinity = -Infinity + (-Infinity))
{1--2,4--5} -> 1 + 1 = 2 (> -Infinity = 2 + (-Infinity))
最后我们可以使用表格来确定最佳解决方案。
寻找雕刻分解
有复杂的算法可以找到好的雕刻分解,但您可能不需要它们。尝试一个简单的二进制空间分区方案。
关于algorithm - “pattern-filling with tiles” 谜题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3331724/
我需要为客户端调整 bittrex api: LIMIT_BUY 或 LIMIT_SELL(和 CANCEL)订单到目前为止有效。 但是他遇到了部分填充的问题。 api 文档。在他们的网站上没有提到这
所以我发现 color 数据类型实际上是一个 int,阅读了一些有关位移位的内容,目的是让自己成为一个类来处理这个问题。 这是基本代码(没有 getters/setters,所有内容都是 public
这个问题在这里已经有了答案: Unexpected behavior using Array Map on an Array Initialized with Array Fill [duplica
当我在 zoom to fill screen 和 stretch to fill screen 之间切换时,我的应用程序会崩溃。顺便说一下,我注意到市场上很多应用程序都有这个问题。有谁知道如何避免这
Sample Text Here Sign Up 我有上面的 HTML 部分,我正在尝试
在html中我可以设置背景图片的下面属性吗?(图片在iOS中我可以像下面这样设置图片的填充属性,但我不知道html中是否有类似的属性): Scale to Fill, Aspect Fit, Aspe
我对 HTML 上一个填充和另一个填充之间的现有空间感到困扰。每个填充物都适合倾斜的一侧。我希望完全填满这条线,但还有空间。 这是示例代码: var canvas = document.createE
考虑 pygame 循环中的这一行: pygame.display.set_mode().fill((0, 200, 255)) 发件人:http://openbookproject.net/thin
我在一个系统上观察到 std::fill在大 std::vector设置常量值 0 时明显且始终较慢与常数值 1 相比或动态值: 5.8 GiB/s 对比 7.5 GiB/s 但是,对于较小的数据大小
我正在做一个元素。在那个元素中,我需要一个 div 的渐变背景。我只需要一种颜色来填充 40px。另一种颜色填充计算(100%-40px)。我从来没有这么深入地玩过渐变。我的 40px 颜色是 rgb
我正在使用的 API 的用户注册代码一直存在问题。 我有一个 UserController,它获取发布的数据并验证字段。然后它将数据发送到我的 UserService 类中的 SignUpUser 方
Facebook AudienceNetwork 加载失败:无填充,错误消息“无填充”,FaceBook android Advertise 的原因是什么? Facebook 广告经常显示加载频率,频
我在 UITableViewCell 中使用了 UIImageView,它将填充 contentView。我尝试了不同的模式,如“缩放以填充”、“Aspect Fit”、“” Aspect Fill”
这个问题已经有答案了: Array.fill(Array) creates copies by references not by value [duplicate] (3 个回答) 已关闭 4 年前
问题 我将我的一些图像放在 /assets/images 文件夹中。然后在 layouts/_default/single.html 中,我为不同的屏幕尺寸创建了一个主图部分,如下面的代码所示。问题是
我知道有 CGContextClearRect ,尽管它可以让你清除 drawRect 类中的所有内容。我如何选择一个 CGContextRef 并清除它?对于我的情况,我的代码如下: //Put c
我有一个包含 3 列的 Tlistview,我需要来自 Tcollection 对象,如下所示 FListeDispoProduit := TListeDispoProduit.Create(TPro
有没有办法抑制babel提供的polyfill?例如,转译以下内容: const obj = { a: 1 }; const obj2 = { ...obj }; 将输出 var _extends =
如何使用 Excel 中的 VBA(所有单元格)将所有工作表填充颜色设置为无填充。与选择所有工作表相同,选择所有单元格 (Control+A) 并将填充颜色更改为无填充。 最佳答案 未经测试,但应该可
我想知道如何在数组上应用洪水填充,我的数组是二维的,其中包含 times new roman 字体类型的字母边界。边界线包含 1,内外全为 0。我只想在内部填充所有 1 而不是 0。但我需要一个不需要
我是一名优秀的程序员,十分优秀!