我正在尝试解决这个递归练习:
在一个多维板(M x N)中,他的每个元素都可以是空的或满的。
“污点”大小是彼此相邻且元素值为'x'的元素数。
例如,这是一个多维数组(数字是行/列号)
| 0 | 1 | 2 | 3 | 4 |
0 | | x | | | x |
1 | x | | | x | x |
2 | | | x | x | |
3 | x | | | | |
4 | x | x | x | | |
有3种污渍
我们需要编写一个具有以下签名的递归方法:
public static int stain (char [][] mat, int row, int col)
该方法将获得一行和一列并从该地方计算污渍大小,如果没有污渍,它将返回0.
我试着写出解决它的方法,但看起来我做得太乱了......你能指引我走向正确的方向吗?我不是在寻找一个直截了当的答案。
感谢。
几点评论:
- 您可以更改数组以解决问题。
- 您可以使用重载
- 你根本不能使用循环
- 您无法使用静态变量
我的代码:
function stain (char[][] mat, int row, int col)
{
int col_len = mat.length;
int row_len = mat[0].length;
if (row < 0 || col < 0 || row >= row_len || col >= col_len)
return 0;
if (mat[row][col] != 'x')
return 0;
mat[row][col] = 'y';
// Count current
int count = 1;
// Go Left
count += stain (mat, row, col-1);
// Go Right
count += stain (mat, row, col+1);
// Go Up
count += stain (mat, row+1, col);
// Go Down
count += stain (mat, row-1, col);
// Go UpperRight
count += stain (mat, row+1, col+1);
// Go UpperLeft
count += stain (mat, row-1, col+1);
// Go DownRight
count += stain (mat, row+1, col-1);
// Go DownLeft
count += stain (mat, row-1, col-1);
return count;
}
答案 0 :(得分:1)
你根本不能使用循环
不幸的是,既然如此,那么你就不会比现有的好得多。通过所有邻居递归的代码可以简化为以下内容,尽管违反了它们,仍然保留了限制的精神:
for (int dx = -1; dx <= 1; dx++) {
for (int dy = -1; dy <= 1; dy++) {
// This calls the function on the middle cell again. That's fine.
count += stain(mat, row + dx, col + dy);
}
}
因为你不能使用循环,所以你确实需要使用稍微不同的参数明确递归8次。这很容易出错并且很痛苦,但是很好。