我在这里要做的是计算方形板上相邻白色块(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。我在这里失踪的是什么?我有种不必要地循环的感觉。
答案 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++;
}