在java 2d数组中连接的邻居

时间:2013-04-16 12:08:47

标签: java algorithm multidimensional-array

我正在设计一个具有2D阵列的游戏引擎:

0,1,1,2,0
0,1,2,1,1
1,0,1,0,2
2,1,2,0,0
2,0,1,0,0

我被困在“游戏结束”状态,因为它必须检查1或2是否已连接。 它应该声明玩家1是赢家并返回:

 1 1
 1   1 1
1  1
1
  1
    1

我尝试通过检查数组中的每个位置并在所有8个方向检查其邻居来尝试使用递归,但该方法需要45秒才能运行,效率很低。

有没有人有任何想法?一个伪代码示例将被赞赏(我是一个慢学习者)。

5 个答案:

答案 0 :(得分:1)

以下是一些提示:

  • 如果可能的话,跟踪从一开始就有多少1和2。
  • 在检查它们是否已连接时,您可以使用boolean矩阵和计数器来跟踪您已检查过哪些以及有多少个。
  • 对必要的邻居使用递归,而不是检查矩阵中的每个位置。

答案 1 :(得分:1)

您需要的是:

Connected_component_labeling

这给出了一个伪代码,

希望有所帮助

答案 2 :(得分:0)

这个问题并不那么容易。在我看来,您可以将矩阵看作图表,然后尝试查看图表是否已连接。即是1s连接的图形,是连接的2s的图形。在这里,您会看到few algorithms。由于您正在创建图形,您还可以跟踪玩家正在创建的节点组,并且在创建新节点时,您可以检查新节点连接的组数和并联新节点所连接的任何组(或者如果没有连接任何内容,请创建一个包含新节点的新组。

顺便说一句,你可以将任何递归转换为循环,但只有当你的堆栈耗尽时才应该这样做。

答案 3 :(得分:0)

从头开始维护UnionFind数据结构,每个条目代表每个单元格。最初,在相邻单元格上使用相同的值执行联合。当玩家标记一个单元格时,如果该值与玩家的值相同,则对相邻单元格执行union()。在联合查找中,您可以跟踪具有值的单元格数量,当该数字等于插入值的次数时,您就有赢家。

您也可以使用描述为here

的算法进行线性处理

答案 4 :(得分:0)

如果a[n][n]a[i][j] = 1已连接,请继续使用i制作重复的图表j

然后您可以执行以下操作:

int count = 0;

void dfs(int i)
{
    int k;
    for(k = 0; k < n; k++)
    {
        if(A[i][k] == 1 && !visited[k])
        {
            count++;
            visited[k] = 1;
            dfs(k);
        }
    }
}

for(i=0; i < n;i++)
{
    if(!visited[i])
    {
        count=1;
        visited[i]=1;
        dfs(i);
        // map i with count .. here
    }
}

因此,一旦您使用其中一个节点映射了网络中节点的计数。

您会找到值计数,如果计数== total_no_of_1

如果是,则连接网络1.如果不是,那么与2的相同并且声明结果。