python - 应用重力的镶嵌钻头板

标签 python algorithm python-3.x bit-manipulation

我正在尝试制作一个带有位板的 gem 迷阵级联模拟器。到目前为止,我已经能够检测并移除火柴,但现在我需要让珠宝掉下来。我的状态由一个位板列表表示,每个位板对应一种 gem 。我有一个所有被移除的珠宝的面具。

是否可以使用一些按位魔术来做到这一点?

两个初始位板的示例(假设只有两种类型的珠宝,并且它是 4x4 板而不是 8x8)。第一位为左下角,第四位为左上角,最后一位为右上角。

0 0 1 1    1 1 0 0
1 0 0 0    0 1 1 1
1 1 1 1    0 0 0 0
0 0 1 0    1 1 0 1

删除匹配后:

0 0 1 1    1 1 0 0
1 0 0 0    0 0 0 0
0 0 0 0    0 0 0 0
0 0 1 0    1 1 0 1

使用的掩码是:

0 0 0 0
0 1 1 1
1 1 1 1
0 0 0 0

在重力之后它应该看起来像:

0 0 0 0    0 0 0 0
0 0 0 0    1 0 0 0
1 0 1 1    0 1 0 0
0 0 1 0    1 1 0 1

这是用整数实现的,步骤如下:

[43814, 21721]       # Initial state
[35076, 4249], 26210 # State after matches have been removed, mask used to remove matches
[8962, 4149]         # State after gravity has been applied

最佳答案

要降低位数,您需要使用位移位将掩码向上移动一行。使用掩码从上面的行中选择位,并使用位移和或运算将所选位向下复制一行。简单的算法会将掩码循环到顶部并逐行向下移动。但优化可能是通过位移位和自身或运算来扩展掩码,然后通过单个操作将所有以上位向下移动。

棋盘操作的良好来源是国际象棋维基:https://chessprogramming.wikispaces.com/General+Setwise+Operations

关于python - 应用重力的镶嵌钻头板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25524678/

相关文章:

python - 如何摆脱 Pandas/Matplotlib 条形图 x 轴上的虚线?

algorithm - 在运行时合并两个排序数组比 O(N) 更快

c - 未在 C 中传递完整数组

python-3.x - Elasticsearch 解析为对象,但发现嵌套值

python - 在 tflite Interpreter 中分配张量时出错

python - 在网络应用程序上使用 PyperClip

python - Django Rest Framework 3.0 to_representation 未实现

python - 使用 Tkinter Canvas 小部件添加放大和缩小?

algorithm - 在不使用 + 和 - 运算符的情况下添加两个数字

Linux 错误 : Unmet Dependencies