54 lines
1.2 KiB
Matlab
54 lines
1.2 KiB
Matlab
function M = makeMaze(n)
|
|
showProgress = false;
|
|
|
|
colormap([1,1,1;1,1,1;0,0,0]);
|
|
set(gcf,'color','w');
|
|
|
|
NoWALL = 0;
|
|
WALL = 2;
|
|
NotVISITED = -1;
|
|
VISITED = -2;
|
|
|
|
m = 2*n+3;
|
|
M = NotVISITED(ones(m));
|
|
offsets = [-1, m, 1, -m];
|
|
|
|
M([1 2:2:end end],:) = WALL;
|
|
M(:,[1 2:2:end end]) = WALL;
|
|
|
|
currentCell = sub2ind(size(M),3,3);
|
|
M(currentCell) = VISITED;
|
|
|
|
S = currentCell;
|
|
|
|
while (~isempty(S))
|
|
moves = currentCell + 2*offsets;
|
|
unvistedNeigbors = find(M(moves)==NotVISITED);
|
|
|
|
if (~isempty(unvistedNeigbors))
|
|
next = unvistedNeigbors(randi(length(unvistedNeigbors),1));
|
|
M(currentCell + offsets(next)) = NoWALL;
|
|
|
|
newCell = currentCell + 2*offsets(next);
|
|
if (any(M(newCell+2*offsets)==NotVISITED))
|
|
S = [S newCell];
|
|
end
|
|
|
|
currentCell = newCell;
|
|
M(currentCell) = VISITED;
|
|
else
|
|
currentCell = S(1);
|
|
S = S(2:end);
|
|
end
|
|
|
|
if (showProgress)
|
|
image(M-VISITED);
|
|
axis equal off;
|
|
drawnow;
|
|
pause(.01);
|
|
end
|
|
end
|
|
|
|
image(M-VISITED);
|
|
axis equal off;
|