C# 这是一个如何找到邻居的问题

C# 这是一个如何找到邻居的问题,c#,multidimensional-array,graph-algorithm,maze,C#,Multidimensional Array,Graph Algorithm,Maze,我完全不知道图形是如何工作的(DFS)。我已经阅读了很多关于如何使用DFS构建迷宫路径查找解算器的教程,但有一部分我不懂。我到底怎样才能知道谁是顶点的邻居? 事实上,我有一个迷宫: 我已将所有字符串放入名为“name”的二维数组中。如果我写下: names[0,0] // it contains the string + 如果我写: names[0,1] // it contains the string - names[1,0] //it contains the st

我完全不知道图形是如何工作的(DFS)。我已经阅读了很多关于如何使用DFS构建迷宫路径查找解算器的教程,但有一部分我不懂。我到底怎样才能知道谁是顶点的邻居? 事实上,我有一个迷宫:

我已将所有字符串放入名为“name”的二维数组中。如果我写下:

names[0,0]  // it contains the string    +
如果我写:

names[0,1] // it contains the string     -
names[1,0]  //it contains the string     B
如果我写:

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

等等。但是名称[1,0]如何知道它的邻居是名称[0,0]、名称[2,0]和名称[1,1]?

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

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 };
        }
    }

}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序49
{
班级计划
{
静态void Main(字符串[]参数)
{
细胞迷宫=新细胞();
maze.Load();
}
}
公共类单元
{
公共静态单元[,]迷宫=新单元[10,10];
public static KeyValuePair start=新的KeyValuePair();
public static KeyValuePair end=新的KeyValuePair();
公共bool topBlock{get;set;}
公共布尔右块{get;set;}
公共布尔底部块{get;set;}
公共布尔左块{get;set;}
公共空荷载()
{
开始=新的KeyValuePair(0,0);
结束=新的KeyValuePair(9,9);
迷宫[0,0]=newcell(){topBlock=true,rightBlock=true,bottomBlock=false,leftBlock=false};
迷宫[0,1]=newcell(){topBlock=true,rightBlock=false,bottomBlock=false,leftBlock=true};
迷宫[0,2]=newcell(){topBlock=true,rightBlock=true,bottomBlock=false,leftBlock=false};
迷宫[0,3]=newcell(){topBlock=true,rightBlock=true,bottomBlock=false,leftBlock=true};
迷宫[0,4]=newcell(){topBlock=true,rightBlock=false,bottomBlock=false,leftBlock=true};
迷宫[0,5]=newcell(){topBlock=true,rightBlock=false,bottomBlock=true,leftBlock=false};
迷宫[0,6]=newcell(){topBlock=true,rightBlock=true,bottomBlock=false,leftBlock=false};
迷宫[0,7]=newcell(){topBlock=true,rightBlock=false,bottomBlock=false,leftBlock=true};
迷宫[0,8]=newcell(){topBlock=true,rightBlock=false,bottomBlock=true,leftBlock=false};
迷宫[0,9]=newcell(){topBlock=true,rightBlock=true,bottomBlock=false,leftBlock=false};
}
}
}

必须有定义迷宫的方法。它可以是一个输入文件,而不是硬编码。使用一些智能包装方案,如使顶行=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}
                          };

构建一个具有四个属性的节点类:Up、Down、Left、Right,用于指示节点在四个方向上是否都有邻居。所以你的迷宫是节点[,]迷宫。@jdweng但是节点如何知道它是否有邻居?Forinstens假设我们有一个有向图,其中a指向B。a如何知道它指向B,B如何知道它不指向a?当然,除非我进入并手动将每个邻居添加到每个节点?但是因为有大约400个节点,这似乎是个坏主意。仔细看迷宫。一些加号之间有垂直/水平线,而另一些加号则没有。节点是4个加号之间的平方。有4个布尔属性(邻域):上、下、左、右可以有垂直/水平线。当存在垂直/水平线时,布尔值为真,这表示由于方向被阻止,因此没有邻居。当有一个邻居(没有行)时,你可以加/减1得到数组中的邻居位置。@jdweng抱歉,你把我完全弄丢了?你能用代码举例吗?我真的不明白的是,我有一个二维数组和字符串,这是伟大的,但似乎我不能用这个二维数组找到任何邻居。所以我需要制作一个新的二维数组(所谓的邻接矩阵),在这里我手动指出谁是谁的邻居。假设[0,0]有[0,1]作为邻居,那么我是否在[0,1]中放入let,现在假设[0,5]有[0,6]作为邻居。它们是如何建立在知道谁是谁的邻居的基础上的?@cop77你不需要一个明确的邻接矩阵。您知道每个位置的4个潜在邻居。对于位置
[i,j]
,您可以有
[i-1,j]
[i+1,j]
[i,j-1]
[i,j+1]
的邻居。如果这些潜在邻居中的任何一个是a)迷宫外的,或b)充满了空间以外的东西,那么它就不是邻居。