Java 如何在二维阵列中搜索给定坐标的邻居

Java 如何在二维阵列中搜索给定坐标的邻居,java,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++)

我试图计算这个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;         

}   
该方法返回
0
,与
1
相反


如果这还不够清楚,请告诉我。提前感谢您的帮助

问题在于您的子句
…&&r!=马来西亚令吉和加拿大令吉!=myC&…

您打算避开
(myR,myC)
单元格,但这将避开行
myR
中的所有单元格和列
myC
中的所有单元格

应改为:

... && !(r == myR && c == myC) && ...
或者通过德摩根定律:

... && (r != myR || c != myC) && ...
这样,只要两个值不等于跳过的值,它就会进行检查,而不是检查其中一个值是否等于跳过的值


另一种方法是利用增量值数组,例如:

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

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

问题在于您的子句
…&&r!=马来西亚令吉和加拿大令吉!=myC&…

您打算避开
(myR,myC)
单元格,但这将避开行
myR
中的所有单元格和列
myC
中的所有单元格

应改为:

... && !(r == myR && c == myC) && ...
或者通过德摩根定律:

... && (r != myR || c != myC) && ...
这样,只要两个值不等于跳过的值,它就会进行检查,而不是检查其中一个值是否等于跳过的值


另一种方法是利用增量值数组,例如:

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

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

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

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]
int count=0;
//检查单元格左侧
if(myC>0&&myC=0&&myC0&&myR=0&&myR
在不使用任何循环的情况下,您可以使用:

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]
int count=0;
//检查单元格左侧
if(myC>0&&myC=0&&myC0&&myR=0&&myR
非常感谢您的回答。事实上,我刚刚发现了它的作用。我很沮丧,我打印了我的工作,并按照程序进行操作,发现了错误。非常感谢你的回答。事实上,我刚刚发现了它的作用。我很沮丧,我打印了我的工作,并按照程序进行操作,发现了错误。非常感谢您,避免重复代码是循环的唯一目的。举例来说,如果他需要改变一些东西,他必须在8个不同的地方改变它。我认为这个解决方案更可读,也更有效。但是我理解你的观点@Obicere,它更多的是代码,因此不太容易维护。当你只需要更改传递到函数中的参数单元格附近的4个单元格,并且你知道它们的位置时,我认为迭代整个矩阵不是一个好主意。e、 g.如果矩阵是1000 x 1000会怎样?避免重复代码是循环的唯一目的。举例来说,如果他需要改变一些东西,他必须在8个不同的地方改变它。我认为这个解决方案更可读,也更有效。但是我理解你的观点@Obicere,它更多的是代码,因此不太容易维护。当你只需要更改传递到函数中的参数单元格附近的4个单元格,并且你知道它们的位置时,我认为迭代整个矩阵不是一个好主意。e、 如果矩阵是1000 x 1000呢。