我创建由正方形组成的大图。 我也有一些简单的数字也包括正方形。
如何在大图中找到简单数字?
- 感谢。
答案 0 :(得分:0)
由于您说方块位于网格上,您可以尝试使用每个小图简单地在网格上循环,以查看相应的方块是否相等。如果是这样,你已经找到了一个简单数字的实例。
如果你想变得更加漂亮,你可以将简单的数字编码为不相交的路径,即第一个简单的数字可能是一条路径:从开始,向右移动。然后对于大图的每个方块,如果你可以完成路径并留在大图的方块上,你就找到了一个单个图形的实例。
答案 1 :(得分:0)
假设大数字B的每一行由一个打包的数组表示,并假设最大的小数字可以包含在一个h-by-v网格中。 (在您的示例图中,h = 3,v = 2.)使用h * v位(或更多,例如4 * 2,或4 * 4,或8 * 2等,以获得方便的大小)为每个小图制作一个掩码M_s。在每个(x,y)处向上和向下移动h-by-v“窗口”,形成值M(x,y),其表示在B中设置并且在当前窗口中的比特。 (此值可以递增计算,即通过为窗口的每一行移位一位。)每当M_s & M(x,y) == M_s
时,您发现了小图的出现。
注意,上面的方法假设小图中的空白单元格“不关心”,即可以匹配B中的空白或非空白。如果这样的单元格是不“不关心”,除了之前使用的非空白地图外,每个小人物都需要一张补充的空白地图。该映射测试M(x,y)的补码。如果M(x,y)窗口与小图相同,则可以将测试组合在一起并测试M_s ^ M(x,y) == 0
而不是M_s & M(x,y) == M_s
。
如果B非常大并且稀疏,则移动小图形模式并直接针对B的单词测试它们可能会更快,而不是将B的位变为值M(x,y);或预先计算移位小图案的阵列。
如果小数字的数量很大,请对它们进行排序,如果w中包含小数字u,则无论何时找不到,都可以跳过w的测试。类似地,如果u和v都包含在w中,则无论何时找不到u或v,都可以跳过对w的测试。但是,只有在第一段中概述的基本方法太慢时,才应尝试这样的优化和前一个优化。