快要大四了,要赶紧复习下数据结构好找工作,哈哈哈哈哈,所以最近在看图相关的算法,光看书没什么感觉,准备实践一下,写个迷宫算法
主要用Prim算法和DFS算法实现了一遍,没有用BFS是因为Prim的思路跟BFS的其实差不太多,但是看别的博客都说Prim比较自然
思路其实大同小异,主要为:常见迷宫(即任意两点间都能够找到路径,且仅有一条成功路径),迷宫可看做一组连通图(用数组储存),默认所有点间都为墙,我们需要做的就是遍历整个图中所有的点,并且不重复访问,在遍历图的过程中将相邻(指的是上下左右相邻)的两个点间的墙随机打通;满足条件的常见算法有:Prim,Kruskal,DFS,BFS,(另外有个博客中写到了递归分割算法,但是因为本菜很懒没有去具体了解)
定义数组:设我们要做一个row*column的迷宫,那么我们的数组的行列应为2*row+1和2*cloumn+1 (不理解为什么可以看这个表情 |O|O| O为点,|为墙)
首先我们要造一堆墙围着相邻的格子,用于之后去打破如图:
代码如下:
//初始化一个地图 默认所有路不通
//row行表示的是刚开始空白格子的行数,而格子之间还有墙壁,所以最终产生的二维数组大小实际为(2row+1) * (2colum+1)
//看到其他博客有其他的思路也可以,可以凭自己爱好:例如 空间:O(row*col),时间:O(墙数=(row-1)*col+row*(col - 1))
//默认为7行6列
private int row = 7;
private int column = 6;
private int[,] LabId;//存放迷宫的数组
private Vector2[,] Pos;
public void Init()
{
int r = 2 * row + 1, c = 2 * column + 1;
LabId = new int[r, c];
for (int i = 0; i < r; i++) //将所有格子都设为墙
for (int j = 0; j < c; j++)
LabId[i, j] = 0;//0 为墙 1为路
//中间格子放为1
for