Привет, сначала спасибо заранее. Во-первых, проблема, с которой я сталкиваюсь в моей программе, заключается в том, что она возвращает неправильное количество пикселей, поэтому позвольте мне объяснить мои проблемы. при выполнении операции смены цвета от цвета в (row, col) в данной матрице. Операция изменения цвета изменяет выбранный цвет и все смежные пиксели одного и того же цвета на указанное значение 100. Цвет считается частью непрерывной области того же цвета, если он ровно на один цвет вверх / вниз / влево / вправо от другого цвета в регионе. Что ясно показывает, что я должен использовать BFS для этой части. Я использую очередь, где сначала я добавил первый цвет queue.add (matrix [row] [col]) из строки и col, указанных в параметр функции, а затем я начал делать BFS из этой строки и ячейки и увеличивал мою переменную «изменен», если я получаю любую ячейку того же цвета, что и ячейка в (строка, столбец), но каким-то образом я получаю 2, даже если есть похожего цвета, который не должен иметь место. Он должен возвращать один, если он не находит ни одной другой ячейки того же цвета.
2-Я должен вернуть ячейку с максимальным значением из та же матрица с учетом начальной и конечной ячеек, но здесь есть ограничение: Путь должен начинаться в (r1, c1) и заканчиваться в (r2, c2) и может быть только Перемещение на один пиксель вверх / вниз / влево / вправо за раз. В этой части мое время l oop никогда не заканчивается даже после того, как очередь пуста.
public int get_cells_modified(int[][] matrix, int row, int col){
//invalid row and col
if (row < 0 | col < 0 | row > matrix.length | col > matrix[0].length)
return -1;
// check if cell is already visited.
boolean[][] visited = new boolean[matrix.length][matrix[0].length];
//left and right neighbours
int[] lr_neighbour = {0, 0, -1,1};
//top and bottom neighbours
int[] tb_neighbour = {1, -1, 0, 0};
//number of cells modified so far
int modified = 0;
//queue of colors
Queue<Integer> queue = new LinkedList<>();
queue.add(matrix[row][col]);
//mark current color as visited.
visited[row][col] = true;
//current color at (row,col)
int color = matrix[row][col];
while (!queue.isEmpty()){
queue.remove();
for (int index = 0;index < 4;index++){
row = row+tb_neighbour[index];
col = col+lr_neighbour[index];
if (row < 0 || col < 0 || row >= matrix.length || col >= matrix[0].length || visited[row][col])
continue;
if (color == matrix[row][col])
//mark all other cells as visited which have value equal to color.
queue.add(matrix[row][col]);
visited[row][col] = true;
modified++;
}
}
//number of that change when performing a color change from the cell at (row,col)
return modified;
}
public int findmax(int[][] matrix, int ur, int uc, int vr, int vc){
// check if cell is already visited.
boolean[][] visited = new boolean[matrix.length][matrix[0].length];
//left and right neighbours
int[] lr_neighbour = {0, 0, -1,1};
//top and bottom neighbours
int[] tb_neighbour = {1, -1, 0, 0};
//queue of colors
Queue<Integer> queue = new LinkedList<>();
queue.add(matrix[ur][uc]);
//maximum value so far
int maximum = 0;
while(!queue.isEmpty()){
//mark current cell as visited.
visited[ur][uc] = true;
//if current color is maximum so far
if (queue.peek() > maximum)
maximum = queue.peek();
//remove it
queue.remove();
for (int index = 0;index < 4;index++){
ur = ur+tb_neighbour[index];
uc = uc+lr_neighbour[index];
if (ur < 0 || uc < 0 || ur >= vr || uc >= vc || visited[ur][uc])
continue;
queue.add(matrix[ur][uc]);
}
}
return maximum;
}
public static void main(String[] args){
int[][] image = {
{2 , 3, 4, 10, 12},
{20 , 30, 14, 11, 13},
{29 , 39, 40, 12, 24},
{40 , 39, 41, 15, 35},
{100 ,23, 24, 60, 80}
};
}