Java在多维中找到“字符串” - 递归

时间:2013-12-16 23:31:02

标签: java

我正在尝试解决这个递归练习:

在一个多维板(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种污渍

  1. 行(0,1),(1,0) - 大小为2
  2. 行(0,4),(1,3),(1,4),(2,2),(2,3) - 5号
  3. 行(3,0),(4,0),(4,1),(4,2) - 大小4
  4. 我们需要编写一个具有以下签名的递归方法:

    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;
    }
    

1 个答案:

答案 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次。这很容易出错并且很痛苦,但是很好。