汉诺塔(Tower of Hanoi)c语言实现

最近在复习C,然后辛辛苦苦打出的代码,不舍得练习完就删了,就copy到这来了,做个纪念

#include
#include //用到exit;
#define N 6 //转移的圆盘个数


int pegs[3][N]={0};//二维数组存储柱子及对应圆盘
int p_num[3]={0};//存储柱子的圆盘个数
int k=0;

//n:移动的圆盘个数,from和to:从哪移到哪,using:中介
void move(int n,int from,int to,int use);
//出栈,peg:柱子序号
int pop(int peg);
//进栈,peg:柱子序号
void push(int peg,int a);
//打印实时动作
void print_action();

int main(){
    int i,nd=N;

    //初始化汉诺塔
    for(i=0;i       pegs[0][i]=nd--;
      p_num[0]++;
    }
    k++;
    printf("%s%6c%6c%6c","序号",'A','B','C');
    print_action();
    move(N,0,2,1);

    return 0;
}

/*
  A、B、C三个柱子,从A到C
  递归思想:移动N个到C,则需移动N-1个到B,再把A剩下的那一个移动到C,然后再将B的N-1个移动到C;
  移动N-1个到B,则需要移动N-2个到C,再把A最上面一个移动到B,然后再将C的N-2个移动到B;
  其他同理。
*/
void move(int n,int from,int to,int use){
    int a;
    if(n>0){
      move(n-1,from,use,to);
      a=pop(from);
      push(to,a);
      k++;
      print_action();
      move(n-1,use,to,from);
    }
}

/*
  出栈
*/
int pop(int peg){
    if(peg<0||peg>2){
      printf("柱子序号不正确!");
      exit(1);
    }else{
      return pegs[peg][--p_num[peg]];
    }
}

/*
  入栈
*/
void push(int peg,int a){
      if(peg<0||peg>2){
      printf("柱子序号不正确!");
      exit(0);
    }else{
      pegs[peg][p_num[peg]++]=a;
    }

}

/*
  打印实时动作
*/
void print_action(){

    int i,j;
    printf("\n%d\t",k);
    for(i=0;i<3;i++){
        for(j=0;j           printf("%d",pegs[i][j]);
        }
        printf("\t");
    }

}

你可能感兴趣的:(练习)