关于Java中泛洪填充算法的问题

时间:2014-12-07 14:23:30

标签: java algorithm flood-fill

做功课,实施算法洪水填充。我正在为本指南编写一个程序:http://en.wikipedia.org/wiki/Flood_fill。我有一些问题:

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

    我认为一定是这样:

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

    我的代码:

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

1 个答案:

答案 0 :(得分:0)

您的代码因此行而中断:

oldColor = pixels[x][y];

oldColor的值必须与您最初传递的值保持一致。删除此行以修复您的代码。您也可以删除下一行,因为它不会更改逻辑:

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

结果应如下所示:

*XXXX
X@@@X
X@#@X
X@@@X
XXXXX
XXX##
XXXXX

Demo.