头歌资源库(7)汉诺塔(循环)

148 阅读1分钟

  一、 问题描述

二、算法思想 

  1. 初始化三个柱子A、B、C,初始时所有的盘子都在柱子A上。
  2. 对于从1到N(N表示盘子的数量)的每一个数字i,执行以下循环: a. 如果i是偶数,则将柱子B视为目标柱子,柱子C视为中转柱子; b. 如果i是奇数,则将柱子C视为目标柱子,柱子B视为中转柱子; c. 在当前的循环中,将柱子A上的最小的i个盘子移动到目标柱子上,中间使用中转柱子; d. 更新柱子A上的盘子数量。
  3. 循环结束后,所有的盘子都移动到了目标柱子上。

三、代码实现

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

执行结果  

结语  

不必太过纠结于他人的评价

做好自己是多么酷的一件事

!!!