Java 2D数组,查找包含元素

时间:2017-03-10 08:11:59

标签: java arrays algorithm math 2d

我有一个像这样声明的2D数组:

private Dots[][] dots = new Dots[8][8];

我正在制作一个用于教育目的的游戏,其中2D阵列充满点,每个点都有从四种颜色的池中随机选择的颜色。游戏的目标是连接点。当您连接相同颜色的点时,它们会被删除,您可以获得它们的分数。目前一切正常,但我想添加一个新功能:

关闭路径时,该路径中包含的所有点也将被删除。 (见图):

我正在考虑一种算法来查找该路径中包含的所有点,但我无法想出一个。

路径存储在LinkedList中(可能不相关,但我只是说它确定:))

总结一下我的问题:我正在尝试用算法来选择蓝点之间的灰点。

注意:

  • 点可以对角连接
  • 路径可以与玩家想要的一样长
  • 封闭路径可以是任何形状

8x8 grid with path

编辑1: 这就是游戏的外观:

dots

编辑2: 这就是我的意思:

  

关闭路径时,该路径中包含的所有点都将是   删除了。

enter image description here

2 个答案:

答案 0 :(得分:1)

  • 固溶:

适当的解决方案是实现 FloodFill算法 4-connected / 4-Neighbor版本。

enter image description here

非常好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相同,但也会在输出集

中添加