MATLAB演示深度优先搜索算法迷宫问题

MATLAB演示深度优先搜索算法迷宫问题

DFS,即深度优先搜索,是一种每次搜索都向尽可能深的地方去搜索,到达尽头时再回溯进行其他结点去搜索的搜索策略。形象的说,这是一种“不撞南墙不回头”的策略。

其实也就是遍历,只不过不像一个线性数组的遍历那么直观罢了。这里采用递归形式的写法。

maze_dfs

完整代码

% 深度优先搜索迷宫问题
%% main.m
global flag h
flag = false;
maze = [0 1 0 0 0 1 1 0 1 1
    0 0 0 0 1 1 0 0 0 0
    0 0 0 0 1 1 0 1 1 1
    0 1 0 0 1 0 0 1 0 0
    0 1 0 0 0 0 0 0 0 1
    0 1 1 0 1 0 1 1 0 1
    0 0 1 1 1 0 1 0 0 1
    1 0 1 0 0 0 1 0 1 1
    1 0 1 0 1 1 1 0 0 1
    1 0 0 0 0 0 1 0 0 0];
h = figure;
axis([0 10 0 10])
axis square off
hold on
p = [1 1];
v = zeros(10);
%% draw_pos.m
function draw_pos(p)
t = 0:.1:2*pi;
x = p(1)-0.5+0.45*cos(t);
y = p(2)-0.5+0.45*sin(t);
plot(x,y,'b','MarkerFaceColor','b');
fill(x,y,'b')
end
%% draw_all.m
function draw_all(p,maze,n)
global h
for i = 1:10
    for j = 1:10
        if maze(i,j) == 0
            rectangle('Position',[i-1 j-1 1 1],'FaceColor',[.9 .9 .9])
        else
            rectangle('Position',[i-1 j-1 1 1],'FaceColor','r')
        end
    end
end
draw_pos(p)
frame = getframe(h); 
im = frame2im(frame);
[imind,cm] = rgb2ind(im,256);
if n == 1
  imwrite(imind,cm,'maze_dfs.gif','gif','Loopcount',inf); 
else 
  imwrite(imind,cm,'maze_dfs.gif','gif','WriteMode','append'); 
end 
pause(.3)
end
%% dfs.m
function dfs(p,d,v,maze,n)
global flag
v(p(1),p(2)) = 1;
if flag
    return
end
draw_all(p,maze,n);
n = n+1;
if (p(1) == 10 && p(2) == 10)
    flag = true;
    return 
end
for i = 1:4
    [x,y] = deal(p(1)+d(i,1),p(2)+d(i,2));
    if x > 0 && x <= 10 && y > 0 && y <= 10 && maze(x,y) == 0 && v(x,y) == 0
        dfs([x,y],d,v,maze,n);
    end
end
end
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度优先搜索算法(DFS)是一种用于图遍历的算法。在MATLAB中,可以使用递归或栈的方式实现DFS算法深度优先搜索从起始节点出发,依次探索每一个可能的路径直到无法继续为止,然后回溯到之前的节点继续探索其他路径。具体的实现步骤如下: 1. 创建一个栈,并将起始节点压入栈中。 2. 进入循环,直到栈为空。在循环中,弹出栈顶节点并标记为已访问。 3. 检查当前节点是否为目标节点。如果是,则搜索结束。 4. 如果当前节点不是目标节点,则将其未访问的邻居节点压入栈中。 5. 重复步骤2。 在MATLAB中,可以使用图对象和栈对象来实现DFS算法。首先,可以使用graph函数创建一个图对象,并指定图的边和顶点。然后,可以创建一个栈对象,开始搜索算法。 具体的MATLAB代码如下: ```matlab function dfsAlgorithm(graph, startNode, targetNode) stack = Stack(); % 创建一个栈对象 visited = false(length(graph.Nodes), 1); % 初始化所有节点为未访问状态 visited(startNode) = true; % 将起始节点标记为已访问 stack.push(startNode); % 将起始节点压入栈中 while ~stack.isEmpty() % 循环直到栈为空 currentNode = stack.pop(); % 弹出栈顶节点 if currentNode == targetNode % 检查当前节点是否为目标节点 disp('找到目标节点!'); return; end neighbors = neighbors(graph, currentNode); % 获取当前节点的邻居节点 unvisitedNeighbors = neighbors(~visited(neighbors)); % 获取未访问的邻居节点 for i = 1:length(unvisitedNeighbors) % 将未访问的邻居节点压入栈中 stack.push(unvisitedNeighbors(i)); visited(unvisitedNeighbors(i)) = true; % 将压入栈的节点标记为已访问 end end disp('未找到目标节点!'); end ``` 这样,就可以使用以上的dfsAlgorithm函数来进行深度优先搜索了。通过传入一个图对象、起始节点和目标节点,可以搜索图中是否存在从起始节点到目标节点的路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值