我有一个像这样声明的2D数组:
private Dots[][] dots = new Dots[8][8];
我正在制作一个用于教育目的的游戏,其中2D阵列充满点,每个点都有从四种颜色的池中随机选择的颜色。游戏的目标是连接点。当您连接相同颜色的点时,它们会被删除,您可以获得它们的分数。目前一切正常,但我想添加一个新功能:
关闭路径时,该路径中包含的所有点也将被删除。 (见图):
我正在考虑一种算法来查找该路径中包含的所有点,但我无法想出一个。
路径存储在LinkedList中(可能不相关,但我只是说它确定:))
总结一下我的问题:我正在尝试用算法来选择蓝点之间的灰点。
注意:
编辑1: 这就是游戏的外观:
编辑2: 这就是我的意思:
关闭路径时,该路径中包含的所有点都将是 删除了。
答案 0 :(得分:1)
适当的解决方案是实现 FloodFill算法 的 4-connected / 4-Neighbor版本。
非常好explained in the Wikipedia article。 java中的一个例子可以是found here.
逐行,将所有字段初始化为白色,然后将用户选择的字段逐行着色并逐行迭代,将字段中间的字段着色(状态:boolean select = true
)灰色:
enum COLOR { BLUE, GREY, WHITE};
boolean select = false;
// iterate row by row
for(int x = 0; x < 8; x++) {
for(int y = 0; y <8; y++) {
//select mode...
if(dots[x][y].color == COLOR.BLUE && !change) {
select = true;
}
//if we are in select and the current field is white -> make GREY
if(select && dots[x][y].color == COLOR.WHITE) {
dots[x][y].color = COLOR.GREY;
}
// if we hit another blue and are in select -> select = false
if(select && dots[x][y].color == COLOR.BLUE) {
select = false;
}
}
}
请注意,仍有一些案例可供审核:
e.g。如果当前迭代的行是一个垂直的蓝色墙,长度是奇数,则它会错误地进入选择模式
答案 1 :(得分:0)
动态规划方法(n ^ 2)
对于任何有资格获得计数的细胞,您需要(i,j-1),(i-1,j)和(i,j + 1),(i + 1,j)。
注意:这个单元格不可能完全在那里它也可能在线下。
创建一个布尔2D数组
让我们举例说明6以下的6个样本
/ *
T T T - - -
T - T - - -
T T T - - -
- T - - - -
- T - - - -
* /
其中T标志着封闭的路径。
2迭代:
第一强>
首先遍历矩阵,如果您发现(i,j-1)和(i-1,j)为真,则将该点包含在Set中(或者无论哪个集合)。 对于边界条件,不要将它们包含在Set中,因为它们永远不会在闭合路径内,所以在第一次迭代结束时你将有
/ *
T T F F F F
T 1 T F F F
T T F F F F
F T 1 F F F
F T 1 F F F
* /
其中1表示集合中包含的点数。
(这里你可能想使用char 2d矩阵而不是布尔值。但是如果你使用boolean那么它也可以用来执行set.contains(new Point(i,j)))
<强>第二强>
执行相同操作但从(n-1,n-1)开始,这次检查(i + 1,j),(i,j + 1)点是否为真。对于二维矩阵中的任何一点,如果你发现它应该是&#39; F&#39;但它是&#39; 1&#39;然后从集合中删除该点。
/ *
T T F F F F
T 1 T F F F
T T F F F F
F F F F F F
F F F F F F
* /
因此经过2次n ^ 2次操作。您已设置包含所需的点数。
是的,1也将作为后续迭代的T
简而言之,与DP不同,我们正在从顶部向左移动到底部向右和底部向右移动到顶部向左,以便确切地找出封闭路径中的哪些点。
F - 不符合条件的
T - 仅限计数
1 - 与T相同,但也会在输出集