- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我不知道如何简洁地描述目标,这可能是为什么我尽管搜索了很多也找不到适用的算法,但一张图清楚地说明了这一点:
给定左侧网格中项目的状态,有谁知道一种算法可以有效地找到右侧网格中显示的结束位置?在这种情况下,所有项目都“掉落了” ” “向下”,但方向当然是任意的。重点是:
这不是作业,我不是学生。这是出于我自己对几何和编程的兴趣。我没有提到语言,因为它无关紧要。我可以用我正在从事的特定项目使用的语言实现任何算法。有用的答案可以用文字或代码来描述;重要的是想法。
这个问题可能会被抽象成某种依赖关系和松弛空间的图(在数学意义上),因此也许可以采用旨在最小化滞后时间的算法。
如果您不知道答案但准备当场尝试编写算法,请记住可能存在循环依赖关系,例如互锁的粉色(向后)“C”和蓝色“T” “形状。 T 的部分在 C 下方,C 的部分在 T 下方。如果互锁项目通过几个部分的“循环”锁定,这将更加棘手。
适用算法的一些注意事项:由于我构建网格对象管理框架的方式,以下所有操作都非常容易和快速:
关于答案的注释:maniek 首先暗示了这一点,但 bloops 提供了一个绝妙的解释。我认为绝对关键是所有移动相同量的部分都保持彼此之间的关系,因此不必考虑这些关系。
对于人口稀少的棋盘,另一个加速方法是移动所有棋子以消除完全空的行。计算空行数和识别空行一侧(“上方”)的棋子非常容易。
最后一点:我确实实现了 bloops 描述的算法,并进行了一些特定于实现的修改。效果很好。
最佳答案
如下归纳定义卡住对象集:
接触底部的物体被卡住。
躺在卡住物体上的物体被卡住。
直觉上,卡住的物体正好到达了它们的最终位置。调用非卡住对象active。
声明:所有事件物体可以同时向下掉落一个单位。
证明:当然,一个事件物体不会撞击另一个事件物体,因为它们相对于彼此的相对位置不会改变。事件对象也不会撞到卡住的对象。如果是这样,那么事件对象实际上是卡住的,因为它躺在一个卡住的对象上。这与我们的假设相矛盾。
我们算法的高级伪代码如下:
while (there are active objects):
move active objects downwards simultaneously until one of them hits a frozen object
update the status (active/frozen) of each object
请注意,在 while 循环的每次迭代中至少有一个对象被卡住。此外,每个对象都只卡住一次。在分析实际算法的运行时复杂性时将使用这些观察结果。
我们使用时间 的概念来提高大多数操作的效率。时间从0开始计算,事件物体每移动一个单位时间需要1个单位时间。观察到,当我们在时间 t
时,在时间 t
当前处于事件状态的所有对象的位移恰好向下 t
个单位。
请注意,在每一列中,每个单元格的相对顺序是固定的。其含义之一是每个单元格最多可以直接阻止另一个单元格掉落。该观察可用于有效地预测下一次碰撞的时间。我们还可以通过最多“处理”每个单元格一次。
我们对列进行索引,从 1 开始,从左到右递增;以及高度从 1 开始的行。为了便于实现,引入一个名为 bottom
的新对象 - 这是唯一一个最初卡住的对象,由高度为 0 的所有单元格组成。
数据结构为了高效实现,我们维护以下数据结构:
一个关联数组 A
包含每个单元格的最终位移。如果一个单元格是事件的,它的条目应该是,比方说,-1
。
对于每一列 k
,我们维护 k
列中事件单元格的初始行号的集合 S_k
。我们需要能够支持对该集合的后续查询和删除。我们可以使用 Van Emde Boas 树,并在 O(log log H)
中回答每个查询;其中 H
是网格的高度。或者,我们可以使用平衡二叉搜索树,它可以在 O(log N)
中执行这些操作;其中 N
是 k
列中的单元格数。
一个优先级队列Q
,它将存储事件单元及其键作为其 future 碰撞的预期时间。同样,我们可以选择查询时间为 O(log log H)
的 vEB 树或每个操作时间为 O(log N)
的优先级队列。
实现
算法的详细伪代码如下:
Populate the S_k's with active cells
Initialize Q to be an empty priority queue
For every cell b in bottom:
Push Q[b] = 0
while (Q is not empty):
(x,t) = Q.extract_min() // the active cell x collides at time t
Object O = parent_object(x)
For every cell y in O:
A[y] = t // freeze cell y at displacement t
k = column(y)
S_k.delete(y)
a = S_k.successor(y) // find the only active cell that can collide with y
if(a != nil):
// find the expected time of the collision between a and y
// note that both their positions are currently t + (their original height)
coll_t = t + height(a) - height(y) - 1
Push/update Q[a] = coll_t
任何对象的最终位置都可以通过查询A
属于该对象的任何单元格的位移来获得。
我们只处理并冷冻每个细胞一次。我们执行固定数量的查找,同时卡住每个单元格。我们假设 parent_object
查找可以在常数时间内完成。整个算法的复杂度是 O(N log N)
或 O(N log log H)
,具体取决于我们使用的数据结构。这里,N
是所有对象的单元格总数。
关于下降网格项目的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11404656/
您能否建议如何在 Bootstrap 或 IE 兼容的 CSS 网格中,在没有 CSS 网格的情况下进行以下布局。 在大屏幕中 头部,左侧堆叠的 body 和右侧覆盖头部和 body 高度的图像。 [
我想在 Objective-C 中绘制一个 15*15 的网格。格子颜色是蓝色的,就像在诺基亚制作“贪吃蛇”游戏的棋盘一样。 我试过使用 for 循环来创建 subview ,但它似乎不起作用,我查看
我正在尝试将 CSS 网格与 grid-template-columns: repeat(auto-fill, auto) 一起使用,单元格被设置为最大宽度,导致每行一个元素。 p> 是否可以让元素宽
我正在努力在网格的自定义列上添加一个指向网站的简单、简单的链接。我用了 Inchoo blog为列添加自定义渲染器,它可以工作。我认为只需修改渲染并添加标签就足够了。但我的希望破灭了,行不通。 如何做
使用 Gnuplot 我绘制了下图 - 现在,正如您在图像中看到的那样,很难在线条之间识别出其末端的块。所以我想用不同的颜色或样式交替着色网格。 我现在用来给网格着色的代码是 - set style
假设我有一个非常简单的 WPF 网格(6 行 x 6 列),定义如下:
我有一个希望绑定(bind)到 WPF 网格的集合。 我面临的问题是列数是动态的并且取决于集合。这是一个简单的模型: public interface IRows { string Messa
我正在使用 Vaadin 8,我想制作某种混淆矩阵。我想知道是否可以根据单元格位置而不是数据提供者手动填充表格/网格的值。 referenceTable.addColumn(reference ->
我在 http://jsfiddle.net/TsRJy/ 上创建了一个带有 div 框的网格. 问题 我不知道如何使 a:hover 工作。 信息 重写 HTML 代码,因为表格不适合我。 http
银光处女在这里。如何使网格周围的用户控件自动调整大小以适应内部网格宽度?目前,当浏览器窗口更宽时,用户控件的显示尺寸约为 300 或 400 像素。它在数据网格周围呈现垂直和水平滚动条,这很丑陋。我想
这个问题已经有答案了: Equal width columns in CSS Grid (11 个回答) 已关闭 2 年前。 使用 CSS Grid,当您不知道会有多少个子项时,如何将所有子项保留在一
我想使用 CSS Grid 的 grid-template-areas。 但问题是我正在使用的 CMS 添加了大量额外的包装器。有没有办法忽略额外的包装?因为它弄乱了漂亮的网格区域...... 我正在
在我的Grid中,当我单击“操作”按钮(下面的代码中显示的“删除和编辑”按钮)时,我需要弹出一个窗口,而不用警告消息提醒用户; 在下面的代码中,我正在使用HANDLER handler: button
这个问题已经有答案了: Equal width columns in CSS Grid (11 个回答) 已关闭 2 年前。 使用 CSS Grid,当您不知道会有多少个子项时,如何将所有子项保留在一
我需要模拟一个仓库,其中有几辆自动驾驶车辆在给定的布局上移动,并具有简单的优先级规则。根据我的理解,这个问题可以通过离散事件模拟(DES)轻松解决,我会使用 SimPy为了这。 我看到的问题是,我似乎
在 ASP.NET 中,我可以让用户控件在页面上的表格中占据多个单元格: 用户控件1: foo bar 第1页: 并且自动调整列宽以适应最大的用户控件。 这也可以在 WPF
我正在寻找一种方法来实时搜索我的网格+要过滤的复选框。我有一个包含学生的网格(照片和姓名)。我想要的是有一个复选框,可以过滤学生所在的不同类(class)。还有一个搜索栏,我可以在其中输入学生姓名。
我正在使用 jQuery 和 jQuery UI 构建一个 Web 应用程序。我陷入了僵局。我需要的是一个 jQuery 网格,它具有可编辑字段,并以某种方式在这些可编辑单元格之一上合并一个自动完成字
我想知道是否有其他 JavaScript 组件可以提供具有多个分组的网格表示。下面是jqGrid的截图我扩展了允许该功能,但它需要获取所有数据。我希望在扩展分组时加载数据。 另一个修改后的 jqGri
我一直在为我将在此处描述的 CSS 问题而烦恼: 在下面的示例 ( https://codesandbox.io/s/jjq4km89y5 ) 中,您可以看到一个可滚动的内容(紫色背景)和一个被左侧面
我是一名优秀的程序员,十分优秀!