一、 问题描述
二、算法思想
- 初始化三个柱子A、B、C,初始时所有的盘子都在柱子A上。
- 对于从1到N(N表示盘子的数量)的每一个数字i,执行以下循环: a. 如果i是偶数,则将柱子B视为目标柱子,柱子C视为中转柱子; b. 如果i是奇数,则将柱子C视为目标柱子,柱子B视为中转柱子; c. 在当前的循环中,将柱子A上的最小的i个盘子移动到目标柱子上,中间使用中转柱子; d. 更新柱子A上的盘子数量。
- 循环结束后,所有的盘子都移动到了目标柱子上。
三、代码实现
#include<stdio.h>
#include<stdlib.h>
typedef struct{int n;char from;char to;char aux;
}HanoiState;
void printMove(char from,char to);
int main()
{int n;HanoiState stack[500];int top=-1;scanf("%d",&n);stack[++top].n=n;stack[top].from='A';stack[top].aux='B';stack[top].to='C';while(top>=0){HanoiState current=stack[top--];if(current.n==1){printMove(current.from,current.to);}else{stack[++top].n=current.n-1;stack[top].from=current.aux;stack[top].to=current.to;stack[top].aux=current.from;stack[++top].n=1;stack[top].from=current.from;stack[top].to=current.to;stack[top].aux=current.aux;stack[++top].n=current.n-1;stack[top].from=current.from;stack[top].to=current.aux;stack[top].aux=current.to;}}printf("The END\n");return 0;
}
void printMove(char from,char to)
{printf("%c->%c\n",from,to);
}
执行结果
结语
不必太过纠结于他人的评价
做好自己是多么酷的一件事
!!!