我正在尝试计算此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
相反。
请告诉我这是否不够明确。感谢您的帮助!
答案 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]