【问题标题】:DFS maze issue how to find neighboursDFS迷宫问题如何找到邻居
【发布时间】:2017-09-09 13:44:08
【问题描述】:

我在弄清楚图形的工作原理(DFS)方面是全新的。我已经阅读了许多关于如何使用 DFS 构建迷宫路径查找求解器的教程,其中有一部分我没有得到。我到底如何找出顶点的邻居是谁? Forinstens 我有这个迷宫: maze

我已将所有字符串放入一个名为“names”的二维数组中。所以如果我坚持写:

names[0,0]  // it contains the string    +

如果我写:

names[0,1] // it contains the string     -

如果我写:

names[1,0]  //it contains the string     B

等等。但是 names[1,0] 怎么知道它的邻居是 names[0,0]、names[2,0] 和 names[1,1] 呢?

【问题讨论】:

  • 您构建了一个具有四个属性的 Node 类:Up、Down、Left、Right,这表明一个 Node 是否在四个方向上都有一个邻居。所以你的迷宫是 Node[,] 迷宫。
  • @jdweng 但是节点如何知道它是否有邻居? Forinstens 假设我们有一个 A 指向 B 的有向图。A 怎么知道它指向 B,B 怎么知道它不指向 a?除非我当然进入并将每个邻居手动添加到每个节点?但由于有 400 个节点,这似乎是个坏主意。
  • 没有。仔细观察迷宫。一些加号在它们之间有垂直/水平线,而另一些则没有。节点是 4 个加号之间的正方形。有 4 个属性是布尔值(邻居):上、下、左、右,可以有垂直/水平线。当存在垂直/水平线时,布尔值为真,表示由于方​​向被阻挡,因此没有邻居。当有邻居(无行)时,您可以加/减 1 以获取数组中的邻居位置。
  • @jdweng 抱歉,你完全把我弄丢了?你能举个例子吗?我真正不明白的是我有一个带有字符串的二维数组,这很棒,但似乎我无法使用该二维数组来查找任何邻居。所以我需要创建一个新的二维数组(所谓的邻接矩阵),在其中手动指出谁是谁的邻居。所以让我们说 [0,0] 有 [0,1] 作为邻居,然后我是否在 [0,1] 中放置一些东西,现在让我们说 [0,5] 有 [0,6] 作为邻居。他们如何据此知道谁是谁的邻居?
  • @cop77 您不需要显式的邻接矩阵。您知道每个位置的 4 个潜在邻居。对于位置[i,j],您可以拥有[i-1,j][i+1,j][i,j-1][i,j+1] 的邻居。如果这些潜在的邻居中的任何一个是a)在迷宫之外,或b)被空间以外的东西填充,那么它就不是邻居。

标签: c# multidimensional-array graph-algorithm maze


【解决方案1】:

你必须有定义迷宫的方法。它可以是输入文件而不是硬编码。使用一些智能包装方案,例如使顶线= 1,右线= 2,底线= 4,左线= 8。整个迷宫可以这样定义:

            int[,] maze = {
                          {0x39,0x3B,0x95,0x39,0x53},
                          {0xC6,0xC4,0x6B,0xAB,0x32},
                          {0x95,0x3D,0x3A,0x83,0xAA},
                          {0xAB,0x85,0x6C,0x68,0x6A},
                          {0xAA,0xC5,0x39,0x3A,0x96},
                          {0xC6,0x93,0xC6,0xC2,0xAB},
                          {0xD5,0x2C,0x17,0x92,0xC6},
                          {0x95,0x6D,0x45,0x6C,0x3B},
                          {0xC5,0x55,0x39,0x57,0x86},
                          {0xD5,0x55,0x6C,0x55,0x45}
                          };

【讨论】:

    【解决方案2】:

    我启动了代码并从您提供的链接中加载了第一行迷宫

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Data;
    
    
    
    namespace ConsoleApplication49
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                Cell maze = new Cell();
                maze.Load();
    
            }
    
        }
        public class Cell
        {
            public static Cell[,] maze = new Cell[10, 10];
    
            public static KeyValuePair<int, int> start = new KeyValuePair<int, int>();
            public static KeyValuePair<int, int> end = new KeyValuePair<int, int>();
    
            public bool topBlock { get; set; }
            public bool rightBlock { get; set; }
            public bool bottomBlock { get; set; }
            public bool leftBlock { get; set; }
    
            public void Load()
            {
                start = new KeyValuePair<int, int>(0, 0);
                end = new KeyValuePair<int, int>(9, 9);
    
                maze[0, 0] = new Cell() { topBlock = true, rightBlock = true, bottomBlock = false, leftBlock = false };
                maze[0, 1] = new Cell() { topBlock = true, rightBlock = false, bottomBlock = false, leftBlock = true };
                maze[0, 2] = new Cell() { topBlock = true, rightBlock = true, bottomBlock = false, leftBlock = false };
                maze[0, 3] = new Cell() { topBlock = true, rightBlock = true, bottomBlock = false, leftBlock = true };
                maze[0, 4] = new Cell() { topBlock = true, rightBlock = false, bottomBlock = false, leftBlock = true };
                maze[0, 5] = new Cell() { topBlock = true, rightBlock = false, bottomBlock = true, leftBlock = false };
                maze[0, 6] = new Cell() { topBlock = true, rightBlock = true, bottomBlock = false, leftBlock = false };
                maze[0, 7] = new Cell() { topBlock = true, rightBlock = false, bottomBlock = false, leftBlock = true };
                maze[0, 8] = new Cell() { topBlock = true, rightBlock = false, bottomBlock = true, leftBlock = false };
                maze[0, 9] = new Cell() { topBlock = true, rightBlock = true, bottomBlock = false, leftBlock = false };
            }
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 2020-03-05
      相关资源
      最近更新 更多