【问题标题】:Making sure the Matrix is Adjacent Using Recursion and Arrays使用递归和数组确保矩阵相邻
【发布时间】:2021-02-12 23:34:14
【问题描述】:

我正在尝试使用递归和数组来确保矩阵是相邻的(水平、垂直或对角线),就像我已经开始的那样。如果它是相邻的,我希望它打印“A”。但是我遇到了麻烦,我们将不胜感激!



class Colony
{
   public static void ExploreAndLabelColony(char grid[][], int i)
   {  
   
      for (int j=0; j<grid[0].length; j++)
      {
         if (i == grid.length && j == grid[0].length) //prints colony
         {
            System.out.print(grid[i][j]);
         }
         
         else
         {  
            if (grid[i][j] == '1') //checks if theres a 1 and checks if elements are adjacent and if they are print 'A'
            {
               if (i>0 && i + 1 < grid.length && j>0 && j + 1 < grid[0].length)
               {
                  if (grid[i+1][j] == '1' || grid[i][j+1] == '1' || grid[i-1][j] == '1' || grid[i][j-1] == '1')
                  {
                     grid[i][j] = 'A';
                     System.out.println(grid[i][j]);
                   //ExploreAndLabelColony(grid, i+1);

                  }
               }  
               else if(grid[i][j] == '0') //replaces 0 with '-'
               {
                  grid[i][j] = '-';  
                  ExploreAndLabelColony(grid, i+1);
               }
            }  
         //ExploreAndLabelColony(grid, i+1);
         }
      }

   }
   
   
   public static void main(String[] args)
   {
      char grid[][] = {{'0','0','0','1','1','0','1','1','0','0','0','1','1','1','0','1','1','1','0','1'},
                      {'1','0','0','0','0','1','0','0','0','1','0','0','0','0','0','1','1','1','1','1'},
                      {'0','1','0','0','1','0','0','0','1','0','1','0','0','0','0','0','0','1','1','1'},
                      {'1','1','1','0','0','1','0','1','0','0','0','0','1','0','1','1','0','1','1','0'},
                      {'0','1','1','1','0','1','1','1','0','1','0','0','1','0','1','0','1','1','0','1'}};
      
      ExploreAndLabelColony(grid, 0);
   
   }
}

【问题讨论】:

  • 请定义邻接矩阵的含义。根据维基百科,“在图论和计算机科学中,adjacency matrix 是用于表示有限图的方阵。”你的矩阵不是正方形的。
  • 元素需要水平、垂直或对角相邻@GilbertLeBlanc
  • 部分元素或全部元素。我在您的代码中打印出矩阵,0 和 1 都不是完全连续的。
  • 是的,我知道,它还有另一部分。但我很难找到哪些元素是相邻的。 @GilbertLeBlanc
  • 在您定义足够的相邻之前,我无法帮助您,我可以通过查看网格来判断元素是否相邻。请充分定义问题,以便我可以理解您要做什么。您的网格在位置 4、7 有一个 1。

标签: java recursion matrix


【解决方案1】:

根据您的评论,这就是代码应该做的事情。

  1. 输入是一个由零和一组成的二维字符网格。

  2. 网格上的每个位置都有一个行和一个列坐标。

  3. 一个位置的 1 或 0 分别表示该位置是否存在小区。菌落由相邻细胞形成。如果两个单元格的位置水平、垂直或对角相邻,则将它们视为相邻单元格。

  4. 所有相邻的细胞组成一个菌落。每个菌落都使用字母 A 到 Z 作为标签进行标记。

  5. 一旦每个存储 1 的网格位置都被殖民化,用破折号替换网格上的零。

这是我最后一次测试运行的输出。我打印了输入数组和最终结果。一路上我打印了很多中间结果。

0 0 0 1 1 0 1 1 0 0 0 1 1 1 0 1 1 1 0 1 
1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 1 1 1 1 1 
0 1 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 1 1 1 
1 1 1 0 0 1 0 1 0 0 0 0 1 0 1 1 0 1 1 0 
0 1 1 1 0 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 

- - - A A - A A - - - B B B - C C C - C 
D - - - - A - - - A - - - - - C C C C C 
- D - - A - - - A - A - - - - - - C C C 
D D D - - A - A - - - - E - C C - C C - 
- D D D - A A A - F - - E - C - C C - C 

我逐步建立了这个过程。以下是我的做法。

  1. 我写的第一个方法是打印字符网格的方法。这样,我可以更容易地看到我在处理什么。我测试了这个方法。

  2. 我写的下一个方法是用破折号替换零的方法。我测试了这个方法。

  3. 我写的下一个方法是给我一个java.util.Listjava.awt.Point 坐标,围绕一个活细胞。

  4. 我通过在坐标 0、3 处指定一个活细胞来测试坐标方法。在创建整个 A 菌落之前,我可能进行了一百次或更多测试。这就是写代码的秘诀。写一点代码,测试一下。继续测试它直到它工作。在所有测试通过之前不要添加任何代码。

  5. 一旦我使用了坐标方法,我就编写了一个检查整个网格的方法。我必须对这种方法进行几次测试才能正确。

这是完整的可运行代码。

import java.awt.Point;
import java.util.ArrayList;
import java.util.List;

public class AdjacencyTesting {

    public static void main(String[] args) {
        AdjacencyTesting at = new AdjacencyTesting();
        char grid[][] = {
                { '0', '0', '0', '1', '1', '0', '1', '1', '0', '0', '0', 
                    '1', '1', '1', '0', '1', '1', '1', '0', '1' },
                { '1', '0', '0', '0', '0', '1', '0', '0', '0', '1', '0', 
                    '0', '0', '0', '0', '1', '1', '1', '1', '1' },
                { '0', '1', '0', '0', '1', '0', '0', '0', '1', '0', '1', 
                    '0', '0', '0', '0', '0', '0', '1', '1', '1' },
                { '1', '1', '1', '0', '0', '1', '0', '1', '0', '0', '0', 
                    '0', '1', '0', '1', '1', '0', '1', '1', '0' },
                { '0', '1', '1', '1', '0', '1', '1', '1', '0', '1', '0', 
                    '0', '1', '0', '1', '0', '1', '1', '0', '1' } };
        
        System.out.println(at.printGrid(grid));
        grid = at.createColonies(grid);
        grid = at.replaceZeroWithDash(grid);
        System.out.println(at.printGrid(grid));
    }
    
    public char[][] createColonies(char[][] grid) {
        char letter = 'A';
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                List<Point> colony = new ArrayList<>();
                boolean isColony = false;
                colony = getAllNeighbors(grid, i, j, colony, letter);
                while (colony.size() > 0) {
                    isColony = true;
                    Point point = colony.get(0);
                    colony = getAllNeighbors(grid, point.x, point.y, 
                            colony, letter);
                    colony.remove(0);
                }
                
                if (isColony) {
                    letter = (char) ((int) letter + 1);
                }
            }
        }
        return grid;
    }
    
    private List<Point> getAllNeighbors(char[][] grid, int row, int column, 
            List<Point> colony, char letter) {
        char c = grid[row][column];
        if (c == '1') {
            int rowMin = Math.max(0, row - 1);
            int rowMax = Math.min(grid.length - 1, row + 1);
            int colMin = Math.max(0, column - 1);
            int colMax = Math.min(grid[row].length - 1, column + 1);
                    
            for (int i = rowMin; i <= rowMax; i++) {
                for (int j = colMin; j <= colMax; j++) {
                    if (i == row && j == column) {
                        continue;
                    } else if (grid[i][j] == '1') {
                        colony.add(new Point(i, j));        
                    }
                }
            }
            
            grid[row][column] = letter;
        }
        
        return colony;
    }
    
    public char[][] replaceZeroWithDash(char[][] grid) {
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[i].length; j++) {
                if (grid[i][j] == '0') {
                    grid[i][j] = '-';
                }
            }
        }
        return grid;
    }
    
    public String printList(List<Point> group) {
        StringBuilder builder = new StringBuilder();
        for (Point point : group) {
            builder.append(point.toString()).append(" ");
        }
        return builder.toString();
    }
    
    public String printGrid(char[][] grid) {
        StringBuilder builder = new StringBuilder();
        
        for (int i = 0; i < grid.length; i++) {
            builder.append("    ");
            for (int j = 0; j < grid[i].length; j++) {
                builder.append(grid[i][j]).append(" ");
            }
            builder.append(System.lineSeparator());
        }
        
        return builder.toString();
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多