ハノータアルゴリズム
3070 ワード
ハノタアルゴリズムの核心は再帰である.3つのキューがあると仮定すると、c 1,c 2,c 3の初期:c 1(n,n-1,n-2,...,2,1),c 2(),c 3()は、c 1に数字があり、下から上へ:n,n-1,n-2,...,2,1.c 2とc 3は空です
ターゲット:c 3を使用して、c 1上のすべての数字をc 2に搬送
アルゴリズム:1.c 2を介して、c 1上の(n-1,n-2,...,2,1)のn-1個のデータをc 3 2に搬送.そしてc 1上のnをc 2 3に搬送.c 1を介して、c 3上の(n−1,n−1,...,2,1)をc 2上に搬送する.終わります.第1ステップと第3部は,このアルゴリズム自体の再帰呼び出しである.
ターゲット:c 3を使用して、c 1上のすべての数字をc 2に搬送
アルゴリズム:1.c 2を介して、c 1上の(n-1,n-2,...,2,1)のn-1個のデータをc 3 2に搬送.そしてc 1上のnをc 2 3に搬送.c 1を介して、c 3上の(n−1,n−1,...,2,1)をc 2上に搬送する.終わります.第1ステップと第3部は,このアルゴリズム自体の再帰呼び出しである.
#include "stdafx.h"
#include "string.h"
#define uint32 unsigned int
#define uint16 unsigned short
#define uint8 unsigned char
#define BASE 5
uint32 s_c1[BASE]={0};
uint32 s_c2[BASE]={0};
uint32 s_c3[BASE]={0};
void print(){
int max=0,i;
for(i=BASE-1;i>=0;i--){
if(s_c1[i] || s_c2[i] || s_c3[i]){
max=i;
break;
}
}
for(i=max;i>=0;i--){
printf("%d %d %d
",s_c1[i],s_c2[i],s_c3[i]);
}
printf("----------
");
}
// c3, num c1 c2
void hanota(uint32* c1,uint32 num,uint32 *c2, uint32 *c3){
if(num==1){
*c2=*c1;
*c1=0;
print();
}else{
// c2, num-1 , c1 c3
hanota(c1+1,num-1,c3,c2);
// num c1 c2
*c2=c1[0];
c1[0]=0;
print();
// , c1, num-1 c3 c2
hanota(c3,num-1,c2+1,c1);
}
}
int main(int argc, char* argv[])
{
int i;
for(i=0;i return 0;
}