我有多维数组,例如:
int arr[4][3] ={{12, 29, 11, 22},
{14, 22, 22, 22},
{14, 14, 67, 22},
{14, 18, 14, 45}};
现在我想通过预先定义的规则找到匹配例如:
找到所有在水平方向上的“22”数字,在原始数据中找到2个以上的数字(数组中的第1行)
要么
找到垂直的所有“14”数字,在垂直线上找到2个以上的数字(第1,2,3行)
以及斜边顺序(行[1,0],[2,1],[3,2])
现在我知道我可以扫描每个规则的数组并保持macing矢量
但是说阵列是15x15而且我有20条规则它可能非常凌乱
这有什么样的模式或算法吗?
最后,我喜欢模拟像老虎机匹配支付线的东西
答案 0 :(得分:1)
将每条规则分成两部分。
仅扫描整个阵列一次。对于匹配第一部分的单元,在掩码中设置一个位。扫描完成后,使用逻辑运算来匹配第二部分中的模式。根据规则,您可能为数组中匹配的每个值都有一个位掩码。
例如,遵守1)以上的规则超过两个' 22'在行中,2)超过两个' 14'在专栏中。扫描阵列寻找22或14.请注意,从阵列中读取每个数字并进行所有比较效率要高得多,因为一旦值在CPU缓存中,其他比较就是" free" 。两个位掩码将是' 22'位掩码和' 14'位掩码。
有很明显的算法可以在一行或一列中找到多个位。对于R x C矩阵。
A1[C]
A2[C]
for r in 0 .. R-1
A2 |= (A1 & Matrix.row(r))
A1 |= Matrix.row(r)
最后,A2将是具有两个或更多位的所有列的掩码。要查找大于2的数字,只需添加A3等