Ошибка в алгоритме заполнения Flood в Java

У меня проблема с алгоритмом заполнения Flood, но я не понял, что это за ошибка. Я пишу программу для этого руководства: http://en.wikipedia.org/wiki/Flood_fill и это мое сообщение об ошибке:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at BucketFill.fill(BucketFill.java:11)
    at BucketFill.fill(BucketFill.java:22)
    at BucketFill.main(BucketFill.java:49)

Как я могу это исправить? В чем дело? Моя программа верна?

Мой код:

class BucketFill {

    private char[][] pixels;

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

    public void fill(int x, int y, char newColor, char oldColor) {
        oldColor = pixels[x][y];

        if (x < 0) return;
        if (y < 0) return;
        if (x >= pixels.length) return;
        if (y >= pixels[x].length) return;
        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 ответ

Решение

Вы назначаете oldColor прежде чем проверять границы массива. Вы должны переместить его после проверки:

    if (x < 0) return;
    if (y < 0) return;
    if (x >= pixels.length) return;
    if (y >= pixels[x].length) return;
    // now it's safe to assign
    oldColor = pixels[x][y];
Другие вопросы по тегам