最近在复习C,然后辛辛苦苦打出的代码,不舍得练习完就删了,就copy到这来了,做个纪念
#include
#include
#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
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("\t");
}
}