【问题标题】:Transcribing ASCII maze into graph将 ASCII 迷宫转录成图形
【发布时间】:2015-07-04 22:40:56
【问题描述】:

我有一个迷宫,如下所示:

XXXOOOOX
OXXXOXOE
OXXOOXXO
OSXOXXXO
XOOOXOOO

//X = wall
//O = path
//S = startpoint
//E = endpoint

我想将其转录为图形(邻接矩阵),但不确定是否尝试这样做。邻接矩阵是一个布尔列表的列表,true 代表一条可行的路径,false 代表一条不可能的路径(例如,迷宫中的(0,-1) 无法连接到(7,-1)(0,0 是最左上角的节点) )。我不知道如何转录这个,我最好的猜测是把每个元素放在一个列表中,然后是一个带有连接节点的子列表。考虑到这个迷宫的大小,处理起来很困难,所以这里有一个较小的:

X E || A B
S O || C D

对于上述迷宫(1 = 真,0 = 假)是否会出现邻接矩阵?

  A B C D
A 0 0 0 0
B 0 0 0 1
C 0 0 0 1
D 0 1 1 0

//C connects to D (start)
//D connects to B (end)

这真的很令人困惑,我不知道如何将 x,y(有时也是 z)坐标映射到图形。

【问题讨论】:

  • 一般方法是:对于每对 (x,y) 坐标,检查 (x,y) 和 (x-1,y) 是否都可以通过。如果是这样,请输入一个真实的。 (x,y) 的所有其他邻居都相同。默认情况下,不是邻居的所有内容都为 false。
  • @Sirko,对于一个 n*m 维度的迷宫,邻接矩阵是否应该是 n^2 个元素宽和 m^2 个元素深?
  • 对于m*n 迷宫,您将拥有(m*n) 节点,从而产生(m*n) * (m*n) 邻接矩阵。在这里,邻接列表可能是更好的方法,因为您的矩阵会非常稀疏。
  • @riista this 可能会对您有所帮助。

标签: java algorithm graph maze


【解决方案1】:

试试这个

 static void set(boolean[][] paths, int cols, int row0, int col0, int row1, int col1) {
     int index0 = row0 * cols + col0;
     int index1 = row1 * cols + col1;
     paths[index0][index1] = paths[index1][index0]= true;
 }

 static boolean[][] paths(String[] maze) {
     int rows = maze.length;
     int cols = maze[0].length();
     boolean[][] paths = new boolean[rows * cols][rows * cols];
     for (int i = 0; i < rows; ++i) {
         for (int j = 0; j < cols; ++j) {
             if (maze[i].charAt(j) == 'X')
                 continue;
             if (i + 1 < rows && maze[i + 1].charAt(j) != 'X')
                 set(paths, cols, i, j, i + 1, j);
             if (j + 1 < cols && maze[i].charAt(j + 1) != 'X')
                 set(paths, cols, i, j, i, j + 1);
         }
     }
     return paths;
 }

 public static void main(String[] args) {
     String[] maze = {
         "XXXOOOOX",
         "OXXXOXOE",
         "OXXOOXXO",
         "OSXOXXXO",
         "XOOOXOOO",
     };
     boolean[][] paths = paths(maze);
     for (boolean[] row : paths) {
         for (boolean cell : row)
             System.out.print(cell ? "1" : "0");
         System.out.println();
     }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多