void Hanoi(int Num,char A,char B,char C) { if ( Num > 0){ //Numー1枚の円盤をBを利用してAからCへ移動 Hanoi(Num-1, A, C, B); //移動メッセージ printf("move %d th disk from %c to %c \n",Num,A,B); //Num枚目(最も大きな円盤をAからBに移動する) Hanoi(Num-1, C, B, A); //Numー1枚の円盤をAを利用してCからBへ移動 } } void main() { int Num; printf("Number of Disks: "); scanf("%d",&Num); Hanoi(Num,'A','B','C'); //Num枚の円盤を C を利用して A から B へ移動 }
Number of Disks: 2 move 1 th disk from A to C move 2 th disk from A to B move 1 th disk from C to BNumが3の場合の実行結果です。最初の3行は Hanoi(2, A, C, B); 、最後の3行は Hanoi(2, C, B, A);で書き出されます。
Number of Disks: 3 move 1 th disk from A to B move 2 th disk from A to C move 1 th disk from B to C move 3 th disk from A to B move 1 th disk from C to A move 2 th disk from C to B move 1 th disk from A to B
種類数,個数:3,2 k= 0 i= 1 t[]:{ 1 2 3} k= 1 i= 2 t[]: 1{ 2 3} [ 1] 1 2 k= 1 i= 3 t[]: 1{ 3 2} [ 2] 1 3 k= 0 i= 2 t[]:{ 2 1 3} k= 1 i= 2 t[]: 2{ 1 3} k= 1 i= 3 t[]: 2{ 3 1} [ 3] 2 3 k= 0 i= 3 t[]:{ 3 2 1} k= 1 i= 2 t[]: 3{ 2 1} k= 1 i= 3 t[]: 3{ 1 2}
#include "stdafx.h" #include <stdio.h> int t[20];// int n; int r; int count; void perm(int k); int main(int argc, char* argv[]) { do{ printf("種類数,個数:"); scanf("%d,%d",&n,&r); for(int i=1;i<=n;i++) t[i]=i; count =0; perm(0); printf("\n"); }while ( n !=0); return 0; } //中間結果の表示 void show(int i,int k,int t[]){ printf("k=%3d i=%3d t[]:",k,i); if(k==0) printf("{"); for(int j=1;j<=n;j++){ printf("%2d",t[j]); if(j==k) printf("{"); } printf("}\n"); } //n個からr個を取り出すすべての組合わせを作成する //k+1 桁以後のすべての組み合わせを作成 void perm(int k) { int i,w; if(k==r){ //生成した順列を表示 count++; printf(" [%3d] ",count); for (i=1;i<=r;i++){ printf("%2d",t[i]); } printf("\n"); } else { //t[k+1]の数を残りの数と交換する w=t[k+1]; for(i=k+1;i<=n;i++){ t[k+1]=t[i];//固定する数 t[i]=w; //perm(k+1);//順列の場合 show(i,k,t); if(t[k]<t[k+1]) perm(k+1);//次の組み合わせ t[i]=t[k+1];//元に戻す } t[k+1]=w; } }