- 締切済み
perl ハノイの塔の解に順番付けする方法
プログラミング初心者です。 サブルーチンを用いて、ハノイの塔の解を求める課題で詰まっています。 解自体は求めることができたのですが、それぞれの解の順番(輪を移動させる順番)を一緒に表示させよという指示が出ており、この方法がわかりません。 表示順に上から番号を振るという考え方でよろしいのでしょうか。 まず考え方自体が違うようであれば、そこから指摘して頂きたいと思います。 よろしくお願いします。 ちなみに現状ではこのようになっております。 #!/usr/bin/perl sub hanoi { my ($no , $x , $y , $z) = @_; if( $no = $no){ hanoi ($no-1,$x,$z,$y); print "Move", $no ,"from" , "$x" , "to" , "$z" , "\n"; hanoi ($no-1,$y,$x,$z); } } print"入力された枚数のハノイの塔の解(順番付き)\n"; $data=<>*1; hanoi($data , "A" , "B" , "C");
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- namboku
- ベストアンサー率50% (2/4)
「解の順番」というのは、以下のようなアウトプットを想定していると言うことでしょうか? 入力された枚数のハノイの塔の解(順番付き) (1) Move 1 from A to C (2) Move 2 from A to B (3) Move 1 from C to B (4) Move 3 from A to C (5) Move 1 from B to A (6) Move 2 from B to C (7) Move 1 from A to C だとすれば、以下のような以下のようなスクリプトになります。 -------------------------------------------------------------------------------------------- sub hanoi { my ($no , $x , $y , $z) = @_; if ($no == 1) { $cnt++; print "($cnt) Move ", $no ," from " , "$x" , " to " , "$z" , "\n"; } else { hanoi ($no - 1,$x,$z,$y); $cnt++; print "($cnt) Move ", $no ," from " , "$x" , " to " , "$z" , "\n"; hanoi ($no - 1,$y,$x,$z); } } print "入力された枚数のハノイの塔の解(順番付き)\n"; $cnt = 0; $data = 3; hanoi($data , "A" , "B" , "C"); --------------------------------------------------------------------------------------------
- kumoz
- ベストアンサー率64% (120/185)
"Move" の後に表示される数字は、小さい順から付けられた輪の名称になります。3枚で実行すると、次のように表示されます。 Move1fromAtoC Move2fromAtoB Move1fromCtoB Move3fromAtoC Move1fromBtoA Move2fromBtoC Move1fromAtoC 初期状態の A のポールに 1, 2, 3 の輪が積まれているのを想起すれば、どの輪を移動したかわかるので適切な表示だと思います。指示の意味がもう1つわからないところがありますが.....。 1 2 3 A B C