рекурсия — моделирование границы заполнения (C ++)

Я пытаюсь смоделировать метод Boundary Fill с помощью матрицы целых чисел, которая в каждой позиции имеет номер от 0 до 255, который идентифицирует «цвет пикселя», и я спрашиваю позицию, цвет, который нужно изменить, цвет, чтобы заменить его ,
Код, который я реализовал, хорошо работает для квадратных матриц, но если он не квадратный, у меня есть две ошибки:

1 — если количество строк превышает количество столбцов, алгоритм игнорирует последнюю строку и делает все без изменений в этой последней строке.

2 — если количество столбцов больше, чем количество строк, я получаю ошибку сегментации вокруг первых итераций.

Я хотел бы узнать от кого-то, кто мог бы помочь, что я делаю неправильно. Я попытался отладить (с отпечатками, если кто-то мог показать мне лучший способ, будь благодарен). Логика кажется правильной, и эта ошибка сегментации является странной.

Вот код функции:

void BoundaryFill(int*** img, int x, int y, int newColor, int oldColor, int WIDTH, int HEIGTH){
if(x >= 0 && x < WIDTH && y >= 0 && y < HEIGTH && (*img)[x][y] == oldColor && (*img)[x][y] != newColor){

(*img)[x][y] = newColor; //set color before starting recursion
BoundaryFill(img, x + 1, y, newColor, oldColor, WIDTH, HEIGHT);
BoundaryFill(img, x - 1, y, newColor, oldColor, WIDTH, HEIGHT);
BoundaryFill(img, x, y + 1, newColor, oldColor, WIDTH, HEIGHT);
BoundaryFill(img, x, y - 1, newColor, oldColor, WIDTH, HEIGHT);
BoundaryFill(img,x + 1, y + 1, newColor, oldColor,WIDTH,HEIGHT);
BoundaryFill(img,x - 1, y - 1, newColor, oldColor,WIDTH,HEIGHT);
BoundaryFill(img,x - 1, y + 1, newColor, oldColor,WIDTH,HEIGHT);
BoundaryFill(img,x + 1, y - 1, newColor, oldColor,WIDTH,HEIGHT);
} }

Вот основной код:

int main(){
int x, y, new_color,old_color;

//Reads the size of the matrix
int HEIGHT; cin >> HEIGHT;
int WIDTH; cin >> WIDTH;

int** img = new int* [HEIGHT];
for (int i=0;i<HEIGHT;i++)
img[i] = new int [WIDTH];

//Reads the matrix
for (int i=0;i<HEIGHT;i++){
for (int j=0;j<WIDTH;j++){
cin >> img[i][j];
}
}

cin >> x >> y;
old_color = 1; //assuming the old color always gonna be 1
cin >> new_color;

BoundaryFill(&img,x,y,new_color,old_color ,WIDTH,HEIGHT);

//Shows the matrix
for (int i=0;i<HEIGHT;i++){
for (int j=0;j<WIDTH;j++){
cout << img[i][j] << " ";
}
cout << endl;
}

//Free the HEAP
for(int i = 0;i < WIDTH; i++)
delete []img[i];
delete []img;}

Вот некоторые из входных файлов с матрицами, которые я использовал для тестирования (не удалось разместить номера входных данных в матричном формате, но что означают эти числа: первые 2 определяют размер матрицы, количество строк и количество столбцов. Последние три определяют начальную позицию и цвет, который будет заменен. Остальное — это ввод значений для матрицы):

Больше строк:

8 7 2 1 1 1 1 1 2 1 2 1 1 1 2 1 1 1 2 1 2 1 1 1 1 1 2 1 1 1 1 1 2 1 2
1 1 1 2 1 1 1 2 1 2 1 1 1 1 1 2 2 2 1 1 1 2 2 2 1 5

Больше столбцов:

7 8
2 1 1 1 1 1 2 2
1 2 1 1 1 2 1 1
1 1 2 1 2 1 1 1
1 1 1 2 1 1 1 1
1 1 2 1 2 1 1 1
1 2 1 1 1 2 1 1
2 1 1 1 1 1 2 2
2 1
5

0

Решение

Когда вы настраиваете свои массивы в main, первый индекс img вертикальная (ВЫСОТА), а вторая горизонтальная (ШИРИНА). В BoundaryFill, у вас это наоборот, когда вы используете горизонтальный индекс первым и вертикальный индекс вторым.

Вы должны использовать (*img)[y][x] в BoundaryFill,

0

Другие решения

Других решений пока нет …