• 大小: 13KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-31
  • 语言: Matlab
  • 标签: matlab  dfs  并查集  

资源简介

用并查集生成迷宫,用dfs搜索通路,纯属娱乐

资源截图

代码片段和文件信息

%@brief:生成迷宫
%@para: row :定义行长
%       col :定义列长
%       handles:所传图像句柄
%@reval:map:迷宫信息结构体
%@discribe:基于并查集实现
function map = draw_maze(rowcolhandles)

map.row = row;
map.col = col;
map.set = DisjSets(rowcol);%建立并查集
for i = 1:row*col %用来表示连通性,初始时为0 都不连通1234 = 上,下,左,右  
    map.wall(i).sta=zeros(14);
end
 
while  1         %不断考察入口与出口的祖先直到连通为止    
     opt=randi([14]11);
     nrow = randi([1row]11);%生成1个1到row之间的行数
     ncol = randi([1col]11);%生成1个1到col之间的列数
     %任意元素可通过以下规律定位:(所在列数-1)* 行数+所在行数
      cur = row*(ncol-1)+nrow;
     [map.setl_root]=map.set.find(cur);%查找当前
     switch opt 
         case 1 %向上形成通路
             if  nrow == 1 %第一行不向上啥也不干
                continue;
             else 
                  up =  row*(ncol-1)+nrow-1;
                 [map.setr_root]= map.set.find(up);%查找上一个
                 if  l_root~=r_root %当前与上邻居是否连通
                    map.set = map.set.union(l_rootr_root);%不连通,合并根节点,合并集合
                    map.wall(cur).sta(1)=1;%%向上连通
                    map.wall(up).sta(2)=1;%向下连通
                 end
             end
         case 2 %向下形成通路
             if nrow == row %啥也不干
                   continue;
             else
                  down = row*(ncol-1)+nrow+1;
                  [map.setr_root]= map.set.find(down);
                 if  l_root~= r_root %当前与下邻居是否连通
                     map.set = map.set.union(l_rootr_root);%不连通,合并根节点,合并集合
                     map.wall(cur).sta(2) = 1;%向下连通
                     map.wall(down).sta(1)=1;%%向上连通
                 end
             end
         case 3 %向左形成通路
             if ncol == 1%啥也不干
                 continue;
             else
                 left = row*(ncol-2)+nrow;
                  [map.setr_root]= map.set.find(left);
                 if  l_root~=r_root %当前与左邻居是否连通
                    map.set = map.set.union(l_rootr_root);%不连通,合并根节点,合并集合
                     map.wall(cur).sta(3)=1;%向左连通
                     map.wall(left).sta(4)=1;%向右连通
                 end
             end
         case 4 %向右形成通路
             if ncol == col%啥也不干
                  continue;
             else
                  right = row*(ncol)+nrow;
                  [map.setr_root]= map.set.find(right);
                 if  l_root ~= r_root %当前与右邻居是否连通
                     map.set = map.set.union(l_rootr_root);%不连通,合并根节点,合并集合
                     map.wall(cur).sta(4)=1;%向右连通
                     map.wall(right).sta(3)=1;%向左连通
                 end
             end
     end
     [map.setl_root]= map.set.find(1) ;%再次查找
     [map.setr_root]= map.set.find(row*col);
     if (l_root == r_root)
         break;
     end
end

 %fprintf(‘l_root= %dr_root=%d\n‘l_rootr_root);

cla;%先清图层
 
%调用图像句柄
figure(handles);
map.wall = reshape(map.wallrowcol);
map.wall(1).sta(3) = 1;
map.wall(row*col).sta(4) = 1;
line([.5col+.5][row+.5row+.5]) % 画顶边
line([.5.5][.5row-.5]) % 画左边
   for i= 1:co

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2016-01-10 19:00  迷宫寻径\
     目录           0  2016-01-10 12:49  迷宫寻径\@DisjSets\
     文件        1212  2016-01-08 12:46  迷宫寻径\@DisjSets\DisjSets.m
     目录           0  2016-01-10 12:49  迷宫寻径\@Stack\
     文件        1661  2016-01-10 11:38  迷宫寻径\@Stack\Stack.m
     文件        3799  2016-01-10 09:36  迷宫寻径\draw_maze.m
     文件        5666  2016-01-10 11:55  迷宫寻径\maze.fig
     文件        6226  2016-01-10 12:52  迷宫寻径\maze.m
     文件        1931  2016-01-10 15:20  迷宫寻径\tra_maze.m
     目录           0  2016-01-10 19:00  迷宫寻径\测试文件\
     文件        2197  2016-01-08 20:48  迷宫寻径\测试文件\test_disjset.m
     文件         283  2016-01-09 09:56  迷宫寻径\测试文件\test_stack.m

评论

共有 条评论