QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 963|回复: 0
打印 上一主题 下一主题

Matlab深度优先搜索求解迷宫所有解

[复制链接]
字体大小: 正常 放大

2620

主题

162

听众

1万

积分

升级  0%

  • TA的每日心情
    开心
    2015-3-12 15:35
  • 签到天数: 207 天

    [LV.7]常住居民III

    社区QQ达人 发帖功臣 新人进步奖 优秀斑竹奖 金点子奖 原创写作奖 最具活力勋章 助人为乐奖 风雨历程奖

    群组第六届国赛赛前冲刺培

    群组国赛讨论

    群组2014美赛讨论

    群组2014研究生数学建模竞

    群组数学中国试看培训视频

    跳转到指定楼层
    1#
    发表于 2014-11-25 11:02 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    Matlab深度优先搜索求解迷宫所有解
    这两天有空看了看数据结构,决定写一个迷宫所有路径的程序(其实前一段时间玩cody,也遇到过这个问题,不过那个时候用的比较啰嗦的方法,有时间我会把别人优秀的算法贴出来),希望大家一起交流
    function DFS_Maze(maze)
    % 本函数用深度优先遍历(回溯法)来求解迷宫的所有路径
    % maze:是迷宫矩阵,其中0表示可以去走的路
    %                     1表示障碍
    %                     2表示入口
    %                     3表示出径
    %                     5表示路径
    %             0 2 0 0 1
    %             0 1 1 0 1
    %             0 1 3 0 1
    %             0 1 0 0 1

    % copyright: qbb 2013-3-12
    if nargin == 0
        maze = [0 2 0 0 1
            0 1 1 0 1
            0 1 3 0 1
            0 1 0 0 1];
    end
    % 定义四个方向
    directions = kron(eye(2),[-1,1]);
    % 路径个数
    sol = 0;
    [I,J] = find(maze == 2);% 找到起点
    search(I,J);
    disp(sol);
    % 该函数判断该点是否可以经过
        function z = cango(x,y)
            % 用try来判断边界
            z = true;
            try
                if ismember(maze(x,y),[1,2,5])% 路障或者已经走过
                    z = false;
                end
            catch
                z = false; % 边界
            end
        end
        function search(x,y)
            if maze(x,y) == 3 % 找到出口
                disp(maze);   % 打印路径
                sol = sol + 1;% 解的个数增加
                return        % 返回
            end
            % 搜索4个方向
            for i = 1 : 4
                if cango(x + directions(1,i),y + directions(2,i)) % 如果可以走
                    if maze(x + directions(1,i),y + directions(2,i)) ~= 3
                        maze(x + directions(1,i),y + directions(2,i)) = 5;% 记录下来
                    end
                    search(x + directions(1,i),y + directions(2,i)); % 继续寻找下一个点
                    if maze(x + directions(1,i),y + directions(2,i)) ~= 3
                        maze(x + directions(1,i),y + directions(2,i)) = 0; % 回到该节点,继续寻找下一个方向
                    end
                end
            end
        end
    end
    复制代码
    运行结果
    >> DFS_Maze
         0     2     5     5     1
         0     1     1     5     1
         0     1     3     5     1
         0     1     5     5     1

         0     2     5     5     1
         0     1     1     5     1
         0     1     3     5     1
         0     1     0     0     1

         2
    复制代码


    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-5-22 16:32 , Processed in 0.574578 second(s), 50 queries .

    回顶部