亲爱的stackoverflowers。
所以,假设有一个网格,它在某个x和y处的值表示是否存在一个区块(1)或它是否缺失(0)。
例如,
100110100010
100100111110
111110000000
000010000000
还有一些已知的形状A,B和C,例如,
(A) (B) (C)
1 1 1
111, 111, 11
所以我想要实现的是识别网格上哪个1属于哪个形状。 所有的1都应该用完,确切的形状数量是已知的,但是允许旋转(没有镜像),所以我想最好添加旋转版本并认为在网格上找不到某些形状。
所以,预期的结果是(已知它应该是1xA,2xB,2xC):
A00CC0B000C0
A00C00BBBCC0
AABBB0000000
0000B0000000
如果有几种可能的匹配,只要每个瓷砖都分配给它自己的形状,任何都适合。
此外,找出一块瓷砖是否存在(“揭开”)是一项昂贵的操作(但结果是缓存的,瓷砖不会出现在任何地方),所以我实际上正在寻找一种方法来识别它们以尽可能少的“揭露”数量。 (没关系,如果它不是最佳的,只要识别形状就会很棒)。
显然,已知形状的集合可能会发生变化(但是它会在实现时知道并且它将保持不变,因此可以调整特定瓷砖集的代码或开发一些搜索策略),但它不会很大(~5-6),网格也很小(~15x15)。
谢谢!
答案 0 :(得分:0)
使用提示here和/或here(我想使用此提示,对象类型为0
和1
),其中一种方法可能尝试将自己的模式与收集的对象目录进行匹配。举个例子,
100110100010
100100111110
111110000000
000010000000
Shapes A, B and C:
(A) (B) (C)
1 1 1 111 1 11
111 or 1 111 or 1 11 or 1
11
第一个收集的对象可能是,
1 11
1 1
11111
1
=> represented as a set of numbers: [(0,0),(0,1),(0,2),(1,2)..etc]
(the objects need not start or include (0,0) but object
bounds seem needed to calibrate the pattern matching)
对象左上角的测试对象A
将匹配[(0,0),(0,1),(0,2),(1,2)]。在匹配A
之后,程序必须找到校准剩余点的方法 - 右下角将被有效地测量为(2,3)而不是(4,3) - 测试剩余点的右下角对象中的点将匹配对象B
。继续以类似的方式匹配所有,如果未找到总匹配,尝试不同的组合。