这是我的幼稚算法。显然,所有数组访问都应该尊重边界检查。
1)检查网格的每个棋盘格颜色,如仅在 xs 中然后 .s 仅在以下模式中:
x.x.x.
.x.x.x
x.x.x.
.x.x.x
在阅读行中扫描它(每 x 水平,然后下降一行)(提示:在% 2
这里* 2
将成为你的朋友)执行以下操作:
1a) 如果当前图块的颜色与我右下方的图块颜色相同,如果以下任何一个 X 也是相同颜色,则为连续三个:
.....
..XX.
.Xx.X
.X.xX
..XX.
1b)对于一个较低和左侧是相似的:
.....
.XX..
X.xX.
Xx.X.
.XX..
(我会将 X 的位置编码为与您正在检查的中央图块的偏移量 - 如在 {0, -1},{-1, 0},{-1, 1} 等数组中)
(或者,您可以将每个数组实现为 1 的 5 x 5 数组以在此处检查,0 表示不 - 类似于它在此答案中的外观 - 然后在扫描游戏场地时扫描 5 x 5 数组。这可能更快。不知道!你必须测试。)
2)现在从上到下每列向下如果两个相邻的瓷砖颜色相同,检查两个高或三个低的瓷砖 - 如果任何一个颜色相同,那就是连续三个:
.
X
.
x
x
.
X
3)行类似,从左到右阅读:
.X.xx.X
注意:我不知道这是否比检查每个可能的交换以查看它是否连续三个的幼稚算法更快!毕竟,两种算法都是 O(n^2),所以哪个更快取决于实现细节。因此,我推荐两件事:
1)在您实施解决方案之前不要进行优化,对于正在使用它的实际案例,对于使用它的人来说,该解决方案太慢了。
2)当你优化时,检查你是否让它更快!(并确保它仍然有效 - 没有什么比破坏代码的优化更糟糕了:))
当然,这并不意味着优化不好玩,但不要被愚弄认为优化已经足够快的代码除了锻炼你的头脑之外什么都做;)