Ошибка при попытке получить наивысший цвет в Матрице, и пока l oop не прерывается - PullRequest
0 голосов
/ 30 апреля 2020

Привет, сначала спасибо заранее. Во-первых, проблема, с которой я сталкиваюсь в моей программе, заключается в том, что она возвращает неправильное количество пикселей, поэтому позвольте мне объяснить мои проблемы. при выполнении операции смены цвета от цвета в (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}
    };
}
...