递归地更改矩阵中的相同数字
change the same numbers in a matrix recursively
给定一个由 int 数字组成的矩阵、行和列索引(对于包含数字的随机单元格)和一个新数字,我需要递归地 return 矩阵 - 但是现在所有的将随机单元格编号与新单元格相匹配的周围单元格。例如:
对于以下矩阵-
4,1,2,2
4,4,3,1
1,4,4,4
1,4,0,2
由 fill(grid,1,1,0) 调用,
这个需要 returned:
* 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 是我调用的一个函数,它检查两个单元格是否具有相同的编号并且是否彼此相邻
这几天一直卡在这个问题上。希望得到一些帮助
如果我对你的问题的理解正确,你想将所需的值传播给与原始值相等的邻居。
这里的重点是让网格中的每个节点都像一个自动机一样,在自身发生变化时将值传递给邻居。
以下是代码,但我将 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);
}
给定一个由 int 数字组成的矩阵、行和列索引(对于包含数字的随机单元格)和一个新数字,我需要递归地 return 矩阵 - 但是现在所有的将随机单元格编号与新单元格相匹配的周围单元格。例如: 对于以下矩阵-
4,1,2,2
4,4,3,1
1,4,4,4
1,4,0,2
由 fill(grid,1,1,0) 调用, 这个需要 returned:
* 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 是我调用的一个函数,它检查两个单元格是否具有相同的编号并且是否彼此相邻
这几天一直卡在这个问题上。希望得到一些帮助
如果我对你的问题的理解正确,你想将所需的值传播给与原始值相等的邻居。
这里的重点是让网格中的每个节点都像一个自动机一样,在自身发生变化时将值传递给邻居。
以下是代码,但我将 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);
}