2014-12-07 57 views
0

做作业,执行洪泛填充算法。我正在编写一份本指南的程序:http://en.wikipedia.org/wiki/Flood_fill。我有一些问题:关于Java中洪泛填充算法的问题

  1. 是正常的功能,以指定的参数替换任何字符bucketFill.fill (0, 0, '*', 'O');的颜色,我不知道会是什么样的颜色最初这些坐标?
  2. 算法是否正确?我写的,例如维基百科,但我的程序的结果如下:

@@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@ @@@@@

我想,一定是这样的:

*@@@@ 
@@@@@ 
@@#@@ 
@@@@@ 
@@@@@ 
@@@## 
@@@@@ 

我的代码:

class BucketFill { 

    private char[][] pixels; 

    public BucketFill(char[][] pixels) { 
     this.pixels = pixels; 
    } 

    public void fill(int x, int y, char newColor, char oldColor) { 
     if (x < 0) return; 
     if (y < 0) return; 
     if (x >= pixels.length) return; 
     if (y >= pixels[x].length) return; 

     oldColor = pixels[x][y]; 

     if (newColor == pixels[x][y]) return; 
     if (oldColor != pixels[x][y]) return; 

     pixels[x][y] = newColor; 

     fill(x - 1, y, newColor, oldColor); 
     fill(x + 1, y, newColor, oldColor); 
     fill(x, y - 1, newColor, oldColor); 
     fill(x, y + 1, newColor, oldColor); 
    } 

    public void inspect() { 
     for (int y = 0; y < pixels.length; y++) { 
      for (int x = 0; x < pixels[y].length; x++) { 
       System.out.print(pixels[y][x]); 
      } 
      System.out.print("\n"); 
     } 
    } 

    public static void main(String argv[]) { 
     char pixels[][] = 
     { 
      { 'O', 'X', 'X', 'X', 'X' }, 
      { 'X', 'O', 'O', 'O', 'X' }, 
      { 'X', 'O', '#', 'O', 'X' }, 
      { 'X', 'O', 'O', 'O', 'X' }, 
      { 'X', 'X', 'X', 'X', 'X' }, 
      { 'X', 'X', 'X', '#', '#' }, 
      { 'X', 'X', 'X', 'X', 'X' } 
     }; 
     BucketFill bucketFill = new BucketFill(pixels); 
     bucketFill.fill(0, 0, '*', 'O'); 
     bucketFill.fill(3, 0, 'O', 'O'); 
     bucketFill.fill(2, 1, '@', 'O'); 
     bucketFill.inspect(); 
    } 
} 

回答

0

您的代码因此行而中断:

oldColor = pixels[x][y]; 

oldColor的值必须与您最初通过的值相同。删除此行以修复您的代码。您还可以删除下一行,因为它不会改变的逻辑:

if (newColor == pixels[x][y]) return; 

结果应该是这样的:

*XXXX 
[email protected]@@X 
[email protected]#@X 
[email protected]@@X 
XXXXX 
XXX## 
XXXXX 

Demo.

+0

感谢您的回答!我还有一个问题:但是如果我在这里看不到当前颜色:'fill(0,0,'*','O')'?在我的例子中,我使用的不是当前的颜色。 – rel1x 2014-12-07 14:55:49

+0

@pertpoert当您传递与当前颜色不同的颜色时,结果不得更改。 – dasblinkenlight 2014-12-07 15:48:47

+1

要添加到此答案,请查看Boundary Fill算法。它们都是相似的算法,但另一个可能解决“不知道的旧颜色”问题。 – shebang 2014-12-07 16:18:47