Dies kann in der herkömmlichen rekursiven ‚Labyrinth‘ Lösung ‚kriechenden an Wänden‘ gelöst werden:
%%% In file solveMaze.m
function Out = solveMaze (Pts,Accum)
if isempty (Pts); Out = Accum; return; end % base case
x = Accum(1, end); y = Accum(2, end); % current point under consideration
X = Pts(1,:); Y = Pts(2,:); % remaining points to choose from
% Solve 'maze' by wall-crawling (priority: right, up, left, down)
if find (X > x & Y == y); Ind = find (X > x & Y == y); Ind = Ind(1);
elseif find (X == x & Y > y); Ind = find (X == x & Y > y); Ind = Ind(1);
elseif find (X < x & Y == y); Ind = find (X < x & Y == y); Ind = Ind(1);
elseif find (X == x & Y < y); Ind = find (X == x & Y < y); Ind = Ind(1);
else error('Incompatible maze');
end
Accum(:,end+1) = Pts(:,Ind); % Add successor to accumulator
Pts(:,Ind) = []; % ... and remove from Pts
Out = solveMaze (Pts, Accum);
end
Anrufen wie folgt, angegeben A und B wie oben;
Pts = [A.'; B.']; Pts = unique (Pts.', 'rows').'; % remove duplicates
Out = solveMaze (Pts, Pts(:,1)); % first point as starting point
plot(Out(1,:), Out(2,:),'-o'); % gives expected plot
Können Sie dies garantieren: "Wie Sie sehen können, gibt es einige Bedingungen wie: alle bilden rechte Winkel; es gibt keinen Schnittpunkt zwischen den Linien."? Wird das immer so sein? –
Ohne einen klaren Algorithmus klingt das nicht sehr gut definiert. Sie könnten etwas wie ['boundary'] (http://www.mathworks.com/help/matlab/ref/boundary.html#buh3c7k-3) mit einem hohen Schrumpfungsfaktor versuchen, aber ich würde nicht viel darauf wetten Erfolg. Wie @Stewie angedeutet hat: Die Existenz einer Lösung ist schon lange nicht trivial. –
Ich kann diese Ausgabe generieren: http://i.stack.imgur.com/s4TEj.jpg –