【问题标题】:change the same numbers in a matrix recursively递归更改矩阵中的相同数字
【发布时间】:2015-05-14 21:07:35
【问题描述】:

给定一个 int 数字矩阵、一个行和 col 索引(对于包含数字的随机单元格)和一个新数字,我需要递归地返回矩阵 - 但是现在所有与随机匹配的周围单元格手机号码到新的。例如: 对于以下矩阵-

             4,1,2,2
             4,4,3,1
             1,4,4,4
             1,4,0,2

由 fill(grid,1,1,0) 调用, 这个需要退回:

 * 0    1   2   2
   0    0   3   1
   1    0   0   0
   1    0   0   2

我尝试的是以下

public static int[][] fill(int[][] grid, int i, int j, int needed ) {

    if (i<= grid.length - 1 && j<=grid[0].length - 1 && i>0 && j>0) {
    grid[i][j] = needed ;

    if(legal_Neighbor(grid,i,j, i+1,j))
        grid= fill(grid, i+1,j,needed );
    if(legal_Neighbor(grid,i,j, i,j+1))
        grid= fill(grid, i,j+1,needed );
    if(legal_Neighbor(grid,i,j, i,j-1))
        grid= fill(grid, i,j-1,needed );
    if(legal_Neighbor(grid,i,j, i-1, j))
        grid= fill(grid, i-1,j,needed );

    }

其中 legal_Neighbor 是我正在调用的一个函数,它检查两个单元格是否具有相同的编号并且彼此相邻

被困在这个问题上几天了。希望得到一些帮助

【问题讨论】:

  • 根据您发布的示例,邻居概念似乎不寻常,在我看来,您正在替换与提供的坐标所指向的矩阵匹配的每个项目,不是吗?
  • 正确。如果我需要更改的数字是“4”,那么我需要返回一个矩阵,其中所有相邻的“4”都更改为所需的数字
  • 这意味着它只是价值的传播。这很容易
  • @HuStmpHrrr 对于我的第一个硬件来说,它是非递归的,这确实很容易。现在虽然涉及递归,但我似乎无法正确..

标签: java recursion matrix tail-recursion


【解决方案1】:

如果我正确理解您的问题,您希望将所需的值传播给与原点具有同等价值的邻居。

这里的重点是让网格中的每个节点都像自动机一样,如果自身发生变化,将值传递给邻居。

以下是代码,但我将boundaryCheck留空:

static int[][] fill(int[][] grid, int i, int j, int needed) {
    if (!boundaryCheck()) throw new RuntimeException();
    int[][] clone = new int[grid.length][grid[0].length];
    //Clone matrix grid
    for (int k = 0; k < clone.length; k++) {
        clone[k] = grid[k].clone();
    }
    propagate(clone, i, j, needed, grid[i][j]);
    return clone;
}

static void propagate(int[][] grid, int i, int j, int needed, int target) {
    if (!boundaryCheck() || grid[i][j] != target || needed == target) return;
    grid[i][j] = needed;
    propagate(grid, i+1, j, needed, target);
    propagate(grid, i-1, j, needed, target);
    propagate(grid, i, j+1, needed, target);
    propagate(grid, i, j-1, needed, target);
}

【讨论】:

  • 恐怕没有你想象的那么容易(和投赞成票的人)。例如,在您的函数传播中,您传播正确。这个会向左传播(在其他人之间),这个左边会向右传播,直到无限。
  • 覆盖网格....在函数填充中,您可以在propagate(clone, ....)之前克隆矩阵
  • @vivoconunxino 这不是真的....因为,grid[i][j] != targetgrid[i][j] = needed,只有在 needed==target 时才是真的
  • 尝试使用 (2 1 1 1, 1 1 2 1, 1 1 1 1, 1 1 1 1) 和填充 (grid,1,2,0)。传播永远不会达到 0,0
  • @vivoconunxino target == 2,这是由 grid[1][2]=0 修改的(在 grid[i][j] = needed; 中),接下来,它执行四次递归调用,并且全部使用 grid[i][ j] == 1 != 目标(在grid[i][j] != target),然后递归结束
猜你喜欢
  • 1970-01-01
  • 2017-12-04
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-13
  • 2018-03-29
  • 1970-01-01
相关资源
最近更新 更多