課題7-6
/********************************************************************/
/* ハノイの塔の問題を,再帰的呼び出しを使って解くプログラムを */
/* 作成せよ.ハノイの塔の問題とは以下のような問題である. */
/* 3本の棒a, b, cがある.棒aには,中央が空洞になったn枚の円盤が */
/*(下から)大きい順に積まれている.この円盤を1枚ずつ移動させて */
/* 棒bに移す.但し,移動の途中で円盤の大小が逆に積まれてはならない.*/
/* また,棒cは作業用に使用するものとする. */
/********************************************************************/
完成したCプログラム
#include<stdio.h>
#define BUF 256 //読み込みの最大文字数
#define MAX 15 //円盤の最大枚数
/* 静的変数宣言 */
static int n; //円盤の枚数
static int stick[3][MAX]; //棒abcの配列
static int flag; //円盤移動 1:a-b, 2:a-c, 3:b-c
static int menu; //メニュー番号
/* 関数のプロトタイプ宣言 */
int yomi(int,int); //読み込み(最大値〜最大値)
void stick_set(void); //棒aにn枚の円盤を積み,棒bcには0
void hanoi_game(void); //ハノイの塔の問題
void hanoi_look(void); //棒abcにある円盤の表示
char alph(int); //数値をアルファベットに返す関数
int stick_move(int x, int y); //棒xから棒yへ円盤を移動する(1or0)
int stick_top(int x); //一番上の円盤が何番目か求める
/* メイン関数 */
void main(void){
menu = 3;
printf("MainFunc Start\n");
//menuが-2より大きければループ
while(menu>-2){
printf("\n◆◇メニュー◇◆\n");
printf(" 1: ハノイの塔の問題\n");
printf(" 0: ???\n");
printf(" -1: 終了\n");
menu = yomi(-1,1);
if(menu==1) hanoi_game(); //ハノイの塔の問題
else if(menu==0) printf("(ノωヾ*)ウゥ…(ノω・ヾ*)チラ\n");
else if(menu==-1) break; //終了
else printf(" error: ???\n");
}
printf("MainFunc End\n");
}
/* ハノイの塔の問題 */
void hanoi_game(void){
int i, abc; //for文変数i, 棒変数abc(以下説明略)
int flag=1; //カウンタ
int move; //円盤移動変数
printf(" HanoiGame Start\n");
printf(" \nハノイの塔の問題を解きます\n");
printf(" 円盤の数をいくつに設定しますか(1〜%dで入力)\n", MAX);
printf(" 円盤の大きさを数字の大きさに見立てます\n");
while(1){
if((n=yomi(1,MAX)) != -1) break; //円盤の大きさ入力
printf(" error: 1〜%dにして下さい\n", MAX);
}
printf(" nに%dが入力されました\n\n", n);
stick_set(); //棒abcに円盤(数字)をセット
printf(" 棒aの円盤(数字の箇所)を棒bに1枚ずつ移動します\n");
printf(" 円盤の大きさ(数字)は大小逆にできません\n");
printf(" 棒cはこの作業用に使用できます\n");
hanoi_look(); //図で表示
while(1){
printf(" 次の数字を入力して下さい(%d回目)\n", flag);
//カウンタ10回毎に表示する
if(flag%10==0) printf(" (ギブアップならば-1を入力してね)\n");
printf(" (a→b:1, a→c:2, b→a:3, b→c:4, c→a:5, c→b:6)\n");
move = yomi(1,6); //1〜6を入力
if(move==-1){
menu=2; //メニューに戻る
break; //ハノイの塔の問題終了
}
if(move==1 && stick_move(0,1));
else if(move==2 && stick_move(0,2));
else if(move==3 && stick_move(1,0));
else if(move==4 && stick_move(1,2));
else if(move==5 && stick_move(2,0));
else if(move==6 && stick_move(2,1));
else printf(" error: そこは移動できません\n");
hanoi_look(); //図で表示
//円盤が全て棒bに移ったらハノイの塔の問題終了
if(stick[0][0]==0 && stick[2][0]==0) break;
flag++;
}
if(menu==2) printf(" ドンマイ☆またチャレンジしてね!!\n");
else{
printf("*・゜゜*オ.。.メ。.:*(゜∀゜)*:.デ. .。ト*・゜゜・*\n");
printf(" あなたは%d回で解けました(;´Д`)スバラスィ\n", flag);
}
printf(" HanoiGame End\n"); menu=3;
}
次号へ
: