MATLAB演示深度优先搜索算法迷宫问题
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