当前位置: 首页 > 知识库问答 >
问题:

使用bfs具有相同值的单元格数

宇文梓
2023-03-14
 int[][] matrix = {

  {2 , 3, 4, 10, 12},
  {20 , 30, 14, 11, 13},
  {29 , 39, 40, 12, 24},
  {40 , 39, 39, 15, 35},
  {100 ,23, 24, 60, 80}
  }; 

这应该返回3,因为如果我将从单元格(2,1)开始,我将通过上下左右移动得到39,39,39,我的方法看起来像find_cells(int[][]矩阵,int行,int col),其中row和col是起点。不要使用任何帮助器方法。我得到1可能是因为我将邻居标记为true,下次当我试图访问它们时,它会跳过它们。很抱歉缩进了。

     public int find_cells(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 same cells
       int modified = 0;

      //queue
       Queue<Integer> queue = new LinkedList<>();
       queue.add(matrix[row][col]);
      //mark current cell as visited.
       visited[row][col] = true;

      //current pixel at (row,col)
      int current_cell = 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 (current_cell == matrix[row][col]){
                //mark all other valid cells as visited.
                queue.add(matrix[row][col]);
                modified++;
            }
            visited[row][col] = true;
        }
    }

       return modified;
}

共有1个答案

安轶
2023-03-14

看看这个街区:

for (int index = 0;index < 4;index++){
            row = row+tb_neighbour[index];
            col = col+lr_neighbour[index];

让行=2行=1....

然后在第一次迭代时,u使其:row=2+1=3,col=1+0=1...现在您的行和col值改变了…

public int find_cells(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 same cells
        int modified = 0;

        //queue
        Queue<Integer> queue = new LinkedList<>();
        queue.add(row);
        queue.add(col);
        //mark current cell as visited.
        visited[row][col] = true;

        //current pixel at (row,col)
        int current_cell = matrix[row][col];
        int x,y;
        while (!queue.isEmpty()){
            row = queue.remove();
            col = queue.remove();
            for (int index = 0;index < 4;index++){
                x = row+tb_neighbour[index];
                y = col+lr_neighbour[index];
                if (x < 0 || y < 0 || x >= matrix.length || y >= matrix[0].length || visited[x][y])
                    continue;
                if (current_cell == matrix[x][y]){
                    //mark all other valid cells as visited.
                    queue.add(x);
                    queue.add(y);
                    modified++;
                }
                visited[x][y] = true;
            }
        }

        return modified;
    }
 类似资料:
  • 我使用POI API从Postgres数据库生成了excel文档。第一列“Ordre”有许多相同的值。但是我想合并具有相同值的单元格。 我想遵循这个算法: 在字段“ordre”中循环 如果单元格(i)=单元格(i1) 而不是合并它们 但是我有一个问题,在Java中如何说,我不希望它能给出一些令人满意的结果,我开始写这段代码: 任何建议都将不胜感激

  • 这是我第一次在这里发帖,所以请直接回答我的问题,我会尽我所能解释我的问题。 我的工作簿中有两个工作表,其中工作表1直观地表示一个有162个方格的托盘中多个单位(A1到A162)的位置。并不是所有的方格都被填满,因为有些方格是空的。 现在,第2页显示了单位A1到A162的数值。我已经使用条件格式为每个值分配颜色。 我试图从sheet2将A1的颜色复制到sheet1中具有A1值的单元格,但没有成功。

  • 我想要,我的光标移动到下一个具有不同内容的单元格,我想要光标跳过所有已经存在值的单元格。 例如,我们有列:啤酒,汽车,汽车,房子,啤酒,树(KEY_AREA) 光标应选择:Beer、Car、House、Tree和skip 1 Car和1 Beer。

  • 有太多关于大致相同主题的问题,但我找不到我想要的。如果我错过了,我很抱歉。 我正在尝试散集具有公共逻辑元素但使用不同标记定义的XML文件: 两个<代码> 我可以这样做: 所需要的只是在和中实现并分别返回或。 然而,在中有一个属性并以某种方式告诉JAXB将这两个字段映射到它似乎更简单。 我是不是想多了?你将如何实现它? (当然,我无法控制输入XML。如果可能的话,我还想避免使用MOXy的解决方案,因

  • 问题内容: 我正在尝试单击网页上的所有“喜欢”按钮。我知道如何单击其中之一,但我希望能够全部单击它们。它们具有相同的类名,但ID不同。 我是否需要创建某种列表,并告诉它单击列表中的每个项目?有没有写“全部单击”的方法? 这是我的代码的样子(我删除了登录代码): 我知道我无法单击列表,因为它不是单个对象,但是我不知道如何处理。 非常感谢您的帮助。 问题答案: 不幸的是,您只得到了两半,因为ID对于单

  • 我有模板xls,其中每个单元格的字体设置为Arial(font-size:6.5)。在我的应用程序中,我正在使用上面的默认模板生成新的excel报表。 因此,新的excel获得了我的模板XLS中指定的所有属性(字体样式)。 现在,当我使用HSSFRichTextString写入特定单元格时,它的样式不会被应用。比如在包含文本和数字的单元格中,我想把文本做为Arial,把数字做为Terminal。例