• ベストアンサー

ハノイの塔のプログラムの作り方

学校でハノイの塔を組むことになったのですが、具体的なプログラムがわかりません。教えてください。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

ハノイの塔を解く*実際に動く*プログラムをだしてみましょうか. gcc -std=c99 でコンパイル, 実行できることを確認しています. 但し, このプログラムをそのまま提出するとまず間違いなく疑われることになるでしょう. #include <stdio.h> #include <stdlib.h> #include <limits.h> typedef unsigned long long uint64; const int maxDisks = CHAR_BIT * sizeof (uint64); int bitpos(uint64 bits) { int pos = 0; if (bits & 0xFFFFFFFF00000000ULL) { pos += 32; bits >>= 32; } if (bits & 0xFFFF0000ULL) { pos += 16; bits >>= 16; } if (bits & 0xFF00ULL) { pos += 8; bits >>= 8; } if (bits & 0xF0ULL) { pos += 4; bits >>= 4; } if (bits & 0xCULL) { pos += 2; bits >>= 2; } if (bits & 0x2ULL) { pos += 1; bits >>= 1; } return pos; } void doHanoi(int disks) { if (disks >= maxDisks) { fprintf(stderr, "Error: # of disks should be less than %uz\n", maxDisks); return; } int numberOfDisks[3] = { disks, 0, 0, }; uint64 maxCounts = (1ULL << disks)-1; int diskPos[maxDisks]; for (int i = 0; i < maxDisks; i++) { diskPos[i] = 0; } for (uint64 count = 0; count < maxCounts; ) { uint64 oldcount = count++; uint64 changed = count ^ oldcount; changed ^= changed >> 1; int disk = bitpos(changed); int level = --numberOfDisks[diskPos[disk]]; int newPos = ((disk % 2 == 0) ? diskPos[disk]+2 : diskPos[disk]+1) % 3; printf("Move %d from %d (%d) to %d (%d)\n", disk, diskPos[disk], level, newPos, numberOfDisks[newPos]++); diskPos[disk] = newPos; } } int main(int ac, char *av[]) { if (av[1] == 0) { fprintf(stderr, "Usage: %s <# of disks>.\n", av[0]); return EXIT_SUCCESS; } int disks = atoi(av[1]); doHanoi(disks); return EXIT_SUCCESS; }

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

その他の回答 (3)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

「ゲームをする」とはどういう意味でしょうか? ユーザーが実際に円盤を動かせるようにするということ? もしそうだとしたら, 「どの円盤を」「どこに」動かすか, どのように指示するという仕様なんですか? そうでないとしたら, 実際にどのような動作を要求しているのか, きちんと書いてもらえますか? そうそう, 対象となる処理系もちゃんと書いてください. もちろん, 「書いたからといって解いてもらえるとは限らない」んだけどね.

ilikepaso
質問者

お礼

ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

あ~間違えた.... 関数 bitpos が 64ビットであることに依存しているので, const int maxDisks = CHAR_BIT * sizeof (uint64); は const int maxDisks = 64; に変更してください.

ilikepaso
質問者

補足

実際にゲームをするプログラムがほしいのですが・・教えてもらえますか?

全文を見る
すると、全ての回答が全文表示されます。
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

どうぞ・・ http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%8E%E3%82%A4%E3%81%AE%E5%A1%94 #まさか「動くソースが必要」なんてことはないですよね?

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

関連するQ&A

  • ハノイの塔?

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

  • ハノイの塔

    ハノイの塔の解き方がわかりません。解き方と理解のコツなどを教えてください。

  • ハノイの塔のプログラムの疑問点

    ハノイの塔のプログラムについて調べていて http://www.kernelthread.com/hanoi/ というサイトを見つけいくつかの言語でのソースを見ていたら、pascalのところで疑問がある箇所がありました。 writeln('move ', Tfrom:1, ' --> ', Tto:1); というところです。実行すると「move1-->3」など円盤の動きがわかりましたが、ここの「 :1 」という記述の意味がわかりません。 ここの意味を教えてください。

  • ハノイ塔の非再帰について

    VBでハノイの塔(非再帰)で作りたいのですが、 考え方がまったくわかりません。 ハノイの塔(非再帰)をVBで作った事のある方、 良ければ基本的な考え方を教えてください。

  • ハノイの塔の解き方

    ハノイの塔について質問なのですが、 3本棒の 5枚の円盤をときたいのですが、 最短距離で動かす法則を知りたいのですがさっぱり分かりません。 他でも調べたのですが数式がでてきて、よくわからなかったです。すみません、どなたか教えてください!

  • ハノイの塔

    友人に進められて、ハノイの塔のプログラミングをやってみることにしました。 が、棒の下のボタンを押すと、その棒の一番上のリングを選択するようにするには、 どうすればいいか、ちょっと迷っています。 2次元配列がいいのでしょうか?

  • ハノイの塔

    ★自分が理解している事 「(n-1)ハノイが解けると仮定するとnハノイも解けること」 は理解できます。 そして数学的帰納法によりすべての自然数についてハノイは「解ける」 ここまではわかります。 ★わからないのは、その「解き方」です。 「解ける」ことはわかるのですが「解き方」がわからないのです。 何故このプログラムで正解が表示されるのかが理解できないのです。 確かに、紙と鉛筆でプログラムの流れを追っていくと解けています。 しかし、何でこのプログラムで解けるのかがわからないのです。 棒xは出発点 棒yは目的地 棒zは作業棒 です。 (n-1)ハノイをひとかたまりと考え、作業棒Zに移す。 nハノイを目的地Yに移す。 (n-1)ハノイをひとかたまりと考え、目的地Yに移す。 そんな説明で確かに納得した気になりはします。 しかしこのプログラムでは(n-2)以下の場合についてはいっさい語っていません。 何かだまされてる気がします。 このプログラムでは(n-1)について語っていますが (n-2)以下については全く語っていません。 数学的帰納法により「解ける」ことは証明済みですが、 「その解き方」がこのプログラムでよいという「証明」はありますでしょうか? 理解のコツはありますでしょうか? よろしくお願いいたします。 #include<stdio.h> #include<stdlib.h> void hanoi(int n, char x, char y, char z) { if(n==0) {/* 何もしない */} else { hanoi(n-1,x,z,y); printf("%c->%c,",x,y); hanoi(n-1,z,y,x); } } int main(void) { int num; scanf("%d",&num); hanoi(num,'A','B','C'); return 0; }

  • ハノイの塔

    次のc言語で書かれたハノイの塔のプログラムをZ80で動作させたいのですが、アセンブルするとどうなるのでしょうか??教えてください。 void move(char n,char a,char b){ if(n>1)move(n-1,a,6-a-b); if(n>1)move(n-1,6-a-b,b); } int main(){ char n=5; move(n,1,2); }

  • ハノイの塔が分かりません。親切な方お願いします!

    宿題で出たハノイの塔が1時間考えても分かりません。 この紙にそのまま写して書けるようにお教えください!!

  • CommonLispでハノイの塔の円盤の移動回数を数える。

    はじめまして。東吾と言います。 Lispを最近初めて、色々見ながらハノイの塔のプログラムを作ってみました。 それだけじゃ芸が無いから移動の回数を数えてみようとおもったんだけど、行き詰まってしまいました。 idouの出てきた回数を数えれば良いのは分かるんだけどうまく組みこめないんです。 よろしくお願いします。 とりあえず作ってみたハノイの塔のプログラムです。 (defun hanoi (n from to v) (if (= n 1) (idou 1 from to) (let ((n1 (1- n))) (hanoi n1 from v to) (idou n from to) (hanoi n1 v to from)))) (defun idou (n from to) (print `(move ,n from , from to, to)) )