In that case, you also need to be able to add new points to the beginning of the line:
#!/usr/bin/perl
use warnings;
use strict;
my @AoA = (
# [11,29, 10,25],
[15,35, 11,29],
[15,15, 11,21],
[10,25, 11,21],
[15,35, 21,39],
[25,40, 21,39],
[21,11, 25,10],
[15,15, 21,11],
[35,35, 29,39],
[29,39, 25,40],
[35,15, 29,11],
[25,10, 29,11],
[40,25, 39,29],
[35,35, 39,29],
[39,21, 40,25],
[35,15, 39,21],
);
my @line = @{ shift @AoA };
LINE:
while (@AoA) {
for my $index (0 .. $#AoA) {
for my $indices ( [0, 1, -2, -1, 0, 0 + @line],
[2, 3, -2, -1, 2, 0 + @line],
[0, 1, 0, 1, 0, 0],
[2, 3, 0, 1, 2, 0],
) {
if ($AoA[$index][$indices->[0]] == $line[$indices->[2]]
&& $AoA[$index][$indices->[1]] == $line[$indices->[3]]) {
my $new = splice @AoA, $index, 1;
splice @$new, $indices->[4], 2;
splice @line, $indices->[5], 0, @$new;
next LINE
}
}
}
die "No solution for @line.\n";
}
print "@line\n";
|