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;
}
}