搞砸了棋盘游戏的递归代码

时间:2012-04-03 00:47:37

标签: java recursion matrix

我在这里要做的是计算方形板上相邻白色块(2个)的数量,该块由随机黑色(0)和白色(1)块组成。白色块必须位于i+1,j || i-1,j || i,j+1 || i,j-1。技术上对角线不计算在内。我在下面提供了一个例子:

 [1 0 1]
 [1 1 0]
 [0 1 0]

此处count == 3 (0,0)(1,0) and (1,0)(1,1) and (1,1)(2,1)

这是我的代码:

public int count = 0;
    boolean count(int x, int y, int[][] mat)
    {
        if(x<0 || y<0)
            return false;
        if(mat[x][y] == 0)
            return false;

        for(int i = x; i<mat.length; i++)
        {
            for(int j = y; j<mat[0].length; j++)
            {
                if(mat[i][j] == 1)
                {
                    mat[i][j] = 0;
                    if(count(i-1,j,mat))
                        count++;
                    if(count(i,j-1,mat))
                        count++;
                    if(count(i+1,j,mat))
                        count++;
                    if(count(i,j+1,mat))
                        count++;
                }
            }
        }
        return true;
    }

我在这里尝试做的简短解释:我将在板上找到1,当我找到一个时,我将其更改为0并检查其上,下,左,右为1。直到我发现没有相邻的1。我在这里失踪的是什么?我有种不必要地循环的感觉。

2 个答案:

答案 0 :(得分:2)

这是一个没有递归的解决方案

for(int i = 0; i < mat.length; i++) {
    for(int j = 0; j < mat[i].length; j++) {
       if(mat[i][j] == 1) {
          if(i < mat.length - 1 && mat[i+1][j] == 1) {
              count++;
          }
          if(j < mat[i].length - 1 && mat[i][j+1] == 1) {
              count++;
          }
    }
}

答案 1 :(得分:1)

我不认为递归是正确的答案,因为你应该只走一步(找到相邻的值)。相反,只需循环向右和向下看的元素。不要像提到的那样向上看或离开,这样你就不会重复计算匹配数。那就简单了:

for (i=0; i<max; i++)
  for (j=0; j<max; j++)
    if (array[i][j] == 1){
         if (i<max-1 && array[i+1][j] == 1) count++;
         if (j<max-1 && array[i][j+1] == 1) count++;
    }