1. 基本递归算法:
原文:https://blog.csdn.net/hehe5229/article/details/60874167
#include
#include
int count=0;
void move(char getone, char putone) {
count++;
printf("%c-->%c\n", getone, putone);
}
void hanoit(int n, char a, char b, char c) {
if(n == 1){
move(a, c);
} else {
hanoit(n - 1, a, c, b);
move(a, c);
hanoit(n - 1, b, a, c);
}
}
int main() {
int m=5;
/*"%d", &m);*/
hanoit(m, 'A', 'B', 'C');
printf("move times is(T^n-1):%d\n", count);
printf("end\n");
/*system("pause"); */
return 0;
}
可以使用在线编译器查看结果:https://tool.lu/coderunner/
2. 非递归算法
算法来源:《图解算法》
根据规律来提取出算法,为了讨论方便,把三根柱子编号0-2,0为起始柱子:
规律:
#include
/*#include */
int count=0;
// 求a^n次方
int poww(int a, int n){
int i, count=1;
if( n==0 )
return 1;
for (i=0; i=0; j--){
int temp;
temp=poww(2,j);
if(i%temp == 0 && i >= temp )
break;
}
//printf("*****k=%d********\n", j+1);
k=j+1;
//根据规律挪动盘子
if(flag){
if(k%2 != 0){
printf("move1 %d from %d to %d \n", k,site[k],(site[k]+1)%3);
printff(k,site[k],(site[k]+1)%3);
s=(s+1)%3;
site[k]=(site[k]+1)%3;
}
else{
printf("move2 %d from %d to %d \n",k,site[k],abs((site[k]-1+3)%3));
printff(k,site[k],abs((site[k]-1+3)%3));
s=abs((s-1+3)%3);
site[k]=abs((site[k]-1+3)%3);
}
}
else{
if(k%2 == 0){
printf("move3 %d from %d to %d \n", k,site[k],(site[k]+1)%3);
printff(k,site[k],(site[k]+1)%3);
s=(s+1)%3;
site[k]=(site[k]+1)%3;
}
else{
printf("move4 %d from %d to %d \n",k,site[k],abs((site[k]-1+3)%3));
printff(k,site[k],abs((site[k]-1+3)%3));
s=abs((s-1+3)%3);
site[k]=abs((site[k]-1+3)%3);
}
}
}
}
int main () {
hanota(6);
printf("count =%d\n", count);
return 0;
}