幅優先探索をやってみたよ
これは書き直さなくても理解できたんだけど、もののついでで書いてみました。スマートじゃないけど。
キューの代わりに配列を使いました。enqueueはshift、dequeueはpopで代用するだけなので簡単です。
#!perl use strict; # ハッシュでグラフを(ry my %adjacent = ( 'A' => [qw(B C)], 'B' => [qw(A C D)], 'C' => [qw(A B E)], 'D' => [qw(B E F)], 'E' => [qw(C D G)], 'F' => [qw(D)], 'G' => [qw(E)], ); sub queue_search { my ($start, $goal) = @_; my @queue; push @queue, $start; while (my $path = shift @queue) { my $apex = $path->[0]; if ( $apex eq $goal) { # ゴールに到着 @$path = reverse @$path; print "found: @$path\n"; } else { for my $n ( @{ $adjacent{$apex}} ) { # 経路を探索に含まない next if grep { $n eq $_ } @$path; # キューに追加 push @queue, [$n, @$path]; } } } }