如何在2D数组中搜索给定坐标的邻居

时间:2015-03-07 22:51:48

标签: java

我正在尝试计算此2D阵列中相邻单元格中的1的数量。我的方法是检查范围内的每个单元格,并通过条件语句排除不切实际的单元格。

public static int countMines(int [][] mines, int myR, int myC)
{

  int r;
  int c;
  int count = 0;

  for(r = myR - 1; r <= myR + 1; r++)
     for(c = myC - 1; c <= myC + 1; c++)
        if( r >= 0 && r < mines.length && c >= 0 && c < mines.length 
                            && r != myR && c != myC && mines[r][c] == 1)
           count++;


  return count;         

}   

这是我到目前为止的代码。它接受2D数组和要搜索其邻居的单元格的坐标。但它并不像我想要的那样工作。例如,

调用countMines(m, 0,0)m如下

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

方法返回0,与1相反。

请告诉我这是否不够明确。感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

问题在于您的条款... && r != myR && c != myC && ...

您打算避开(myR, myC)单元格,但这会避免行myR中的所有单元格以及列myC中的所有单元格。

应该改为:

... && !(r == myR && c == myC) && ...

或通过德摩根的法律:

... && (r != myR || c != myC) && ...

这样,只要两个值都不等于跳过的值,它就会检查,而 值则相反。


另一种方法是使用delta-values数组,例如:

private static final int[][] DELTA = new int[][]{
        {-1, -1},
        {0, -1},
        {1, -1},
        {1, 0},
        {1, 1},
        {0, 1},
        {-1, 1},
        {-1, 0}
};

然后使用单个循环访问每个偏移量。

答案 1 :(得分:1)

不使用任何循环,您可以使用:

int count = 0;


// Check left of cell
if(myC > 0 && myC < mines.length)
    count += mines[myR][myC - 1]


// Check right of cell
if(myC >= 0 && myC < mines.length -1)
    count += mines[myR][myC + 1]


// Check top of cell
if(myR > 0 && myR < mines.length)
    count += mines[myR - 1][myC]


// Check bottom of cell
if(myR >= 0 && myR < mines.length -1)
    count += mines[myR + 1][myC]