我在矩阵中有合法邻居的递归填充(合法邻居是具有相同颜色的邻居),泛滥不会填充阵列中的所有合法邻居。
我用于测试的电路板是:
int[][] map={{4,0,0,0},
{0,4,0,0},
{0,4,0,0},
{0,4,0,0}};
fill(map,1,1,9,4);// calling to function.
输出是:
4000
0900
0900
0900
修改 如果我将地图更改为:
int[][] map={{4,0,0,0},
{4,4,0,0},
{0,4,0,0},
{0,4,0,0}};
输出结果为:
4000
4900
0900
0900
左边的4个数字也需要填充。
而我的递归函数是:
public static void fill(int[][] map, int row, int col, int color,int oldColor)
{
System.out.println("row is: "+row+"col is:"+col);
if ((row <= 0) || (row >= map.length) || (col <= 0) || (col >= map.length) ) return;
if(map[row][col]==color)
return;
if(map[row][col]==oldColor)
{
map[row][col]=color;
}
if(col+1<=map.length)
fill(map, col+1, row,color,oldColor);
if((col-1)<=0)
fill(map,col-1, row,color,oldColor);
if(row+1<=map.length)
fill(map, col, row+1,color,oldColor);
if((row-1)<=0)
fill(map, col, row-1,color,oldColor);
}
更改代码
public static void fill(int[][] map, int row, int col, int color,int oldColor) {
System.out.println("row is: "+row+"col is:"+col);
if ((row < 0) || (row > map.length) || (col < 0) || (col > map.length) || map[row] [col]!=oldColor ) return;
if(map[row][col]==color)
return;
if(map[row][col]==oldColor)
{
map[row][col]=color;
}
fill(map, col, row-1,color,oldColor);
fill(map, col+1, row,color,oldColor);
fill(map, col, row+1,color,oldColor);
fill(map,col-1, row,color,oldColor);
}
现在输出:
9000
9900
0900
0400
答案 0 :(得分:1)
你有几个错误。首先,你的后卫排除第0行和第0列,这就是为什么你没有得到你期望的结果的原因之一。
现在,确定您将获得堆栈溢出,因为您将尝试填充所有邻居,无论它们具有哪种颜色。这意味着您将永远访问颜色为0的所有单元格。您只想填充具有 oldColor 的邻居。
最后,您的方法需要参数 row,column ,但是您使用列,行来递归调用它,因此您可以切换每个堆栈级别的索引。
修复您可以在没有防范的情况下获得更简单的方法。如果您希望行的长度不同,则需要再次添加防护。
使用自包含示例显示,在填充之前和之后打印地图。
public class FloodFill {
static int[][] map1 ={{4,0,0,0}, {4,4,4,4}, {0,4,0,4}, {0,4,0,0}};
static int[][] map2 ={{0,4,4,4}, {0,4,0,4}, {0,4,0,4}, {9,9,9,4}};
public static void fill(int[][] map, int row, int col, int color, int oldColor) {
if (map[row][col] == oldColor) {
map[row][col] = color;
if (col + 1 < map[row].length)
fill(map, row, col + 1, color, oldColor);
if (col > 0)
fill(map, row, col - 1, color, oldColor);
if (row + 1 < map.length)
fill(map, row + 1, col, color, oldColor);
if (row > 0)
fill(map, row - 1, col, color, oldColor);
}
}
public static void main(String[] args) {
floodfill(map1);
floodfill(map2);
}
private static void floodfill(int[][] map) {
show(map, "Initial");
fill(map, 1, 1, 9, 4);
show(map, "Filled");
}
private static void show(int[][] map, String label) {
System.out.println(label);
for (int[] row : map) {
for (int val : row) {
System.out.print(val + " ");
}
System.out.println();
}
}
}
带护罩的替代填充物,然后处理不同长度的行。
public static void fill2(int[][] map, int row, int col, int color, int oldColor) {
if (row < 0 || row >= map.length || col < 0 || col >= map[row].length)
return;
if (map[row][col] == oldColor) {
map[row][col] = color;
fill2(map, row, col + 1, color, oldColor);
fill2(map, row, col - 1, color, oldColor);
fill2(map, row + 1, col, color, oldColor);
fill2(map, row - 1, col, color, oldColor);
}
}
答案 1 :(得分:0)
这不是最好的答案,但我无法删除我的提交。
public class Fill
{
public static void fill(int[][] map, int col, int row, int color,int oldColor)
{
System.out.println("row is: "+row+"col is:"+col);
if ((row <= 0) || (row >= map.length) || (col <= 0) || (col >= map.length) ) return;
if(map[row][col]==color)
return;
if(map[row][col]==oldColor)
{
map[row][col]=color;
}
if(col+1<=map.length) {
fill(map, col+1, row,color,oldColor);
}
if((col-1)<=0) {
fill(map,col-1, row,color,oldColor);
}
if(row+1<=map.length) {
fill(map, col, row+1,color,oldColor);
}
if((row-1)<=0) {
fill(map, col, row-1,color,oldColor);
}
}
public static void main(String pArgs[])
{
int[][] map={{4,0,0,0},
{0,4,0,0},
{0,4,0,0},
{0,4,0,0}};
printMap(map);
fill(map,1,1,9,4);// calling to function.
printMap(map);
}
static void printMap(int[][] map)
{
for (int i=0; i < 4; i++) {
System.out.print("{");
for (int j=0; j<4; j++) {
System.out.print( map[i][j] + "," );
}
System.out.println("}");
}
}
}