• ベストアンサー

ハノイの塔?

円盤の枚数nをキーボードから入力すると、ハノイの塔の第一軸から第三軸への移動手順を、ファイルに出力するCプログラムを書きたいんですが、よく分かりません、ヒントでもいいのでご指導お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

以前に作ったソースをサンプルとして挙げておきます。 サンプルは5段の塔をAからBに移すモノです。 段数を scanf などで読み込んで printf を fprintf に直し AからCにすればいいんじゃないかと思います。 ---------------------------------------------------------------- /* ハノイの塔  A B C A,B,Cの三つの軸に円盤が置けるようになっている。 円盤は円錐状に大きい円盤の上に小さい円盤が置けるものとする。 一回につき一番上の円盤一枚を動かせ、これを1手とする。 この時、Aにあるn段の円盤をBに動かす為の手順はどうなるか? また、手数はいくつかかるか? */ #include <stdio.h> #define A 1 #define B 2 #define C 4 unsigned long hanoi(int n, int s, int d); char table[]="*AB*C"; void main(void){ printf("%d 手\n",hanoi(5, A , B)); } unsigned long hanoi(int n, int s, int d){/* s:source d:destination */ /* n 段を s から d へ移す。*/ int other,counter=0; other = 7-s-d; if(n==1) printf("No.%d DISC:%c->%c\n", n, table[s], table[d]); else { counter=hanoi(n-1, s , other); printf("No.%d DISK:%c->%c\n", n, table[s], table[d]); counter+=hanoi(n-1, other, d); } return(++counter);/* +1 for printf */ }

rarapico
質問者

お礼

参考になりました。ありがとうございます^^

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • tadys
  • ベストアンサー率40% (856/2135)
回答No.3

ハノイの塔には再起を使わない解法があります。 1~3軸を3角形の頂点位置においたとして 手順1、一番小さい駒を時計方向に1個移動する。 手順2、一番小さい駒以外で移動できる駒を移動する。(自動的に決定されます) 以下、手順1、2を繰り返す。 移動先によっては手順1で反時計回りにする必要がある場合があります。

すると、全ての回答が全文表示されます。
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.1

どこがわからないのかはっきりしませんので答えにくいのですが。 ハノイの塔は再帰アルゴリズムの代表選手です。 ↓のページなんか参考になるかも知れません。

参考URL:
http://www13.plala.or.jp/kymats/study/C++/Hanoi/Hanoi.html
rarapico
質問者

お礼

返事が遅れて申し訳ありません。 下記のサイトとてもわかりやすくて理解できました。 ありがとうございます。

すると、全ての回答が全文表示されます。

関連するQ&A