简单生成随机迷宫的算法___Prim和DFS

快要大四了,要赶紧复习下数据结构好找工作,哈哈哈哈哈,所以最近在看图相关的算法,光看书没什么感觉,准备实践一下,写个迷宫算法

主要用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 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值