Я пытаюсь смоделировать метод 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
Когда вы настраиваете свои массивы в main
, первый индекс img
вертикальная (ВЫСОТА), а вторая горизонтальная (ШИРИНА). В BoundaryFill
, у вас это наоборот, когда вы используете горизонтальный индекс первым и вертикальный индекс вторым.
Вы должны использовать (*img)[y][x]
в BoundaryFill
,
Других решений пока нет …