1#include<stdio.h>2#include<stdlib.h>34#defineN10//円盤の枚数(デフォルト)5#defineM3//柱の本数(固定)6#defineMAX32//円盤の上限78int peg[M][MAX];//柱の状態9int top[M];//柱の一番上1011//柱の状態を表示12voiddisp(void)13{14for(int i =0; i < M; i++){15printf("%c:",'A'+ i);16for(int j =0; j < MAX ; j++){17if(peg[i][j]>0)18printf("%3d", peg[i][j]);19}20printf("\n");21}22}2324//円盤を移動25voidmove(int s,int d)26{27int n = peg[s][top[s]];//sの柱の一番上28 peg[s][top[s]]=0;//円盤を削除29 peg[d][top[d]+1]= n;//dの柱に移動3031 top[s]--;//sの柱を一枚減らす32 top[d]++;//dの柱を一枚増やす33}3435//ハノイの塔を解く36voidhanoi(int no,int x,int y)37{38if(no <1)return;3940hanoi(no -1, x,6- x - y);4142move(x -1, y -1);//円盤を移動43printf("円盤[%d]を%d軸から%d軸へ移動\n", no, x, y);44disp();//柱の状態を表示4546hanoi(no -1,6- x - y, y);47}4849intmain(void)50{51int n;5253printf("ハノイの塔\n円盤の枚数:");54scanf("%d",&n);5556//柱の状態を初期化する57for(int i =0; i < M; i++)58for(int j =0; j < MAX; j++)59 peg[i][j]=0;//各柱には何もない60for(int i =0; i < n; i++)61 peg[0][i]= n - i;//Aの柱に円盤をセット62 top[0]= n -1;//Aの柱の最上位63 top[1]=-1;//Bの柱は円盤無し64 top[2]=-1;//Cの柱は円盤無し6566disp();//柱の状態を表示6768hanoi(n,1,3);//ハノイの塔を解く69}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/13 01:10