Ошибка в алгоритме заполнения 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];