汉诺塔动画版
#include <stdio.h>#include <windows.h>
#define N 4
int ak[3]={0};
int x1=20,y1=40;
int temp[3][9]={0};
void HideCursor()//隐藏光标
{
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursor_info={1,0};
SetConsoleCursorInfo(hOut,&cursor_info);
}
void gotoxy(int x,int y)//设置字符显示位置
{
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
COORD loc={x,y};
SetConsoleCursorPosition(hOut,loc);
}
void move(char a,char b)
{
int m=a-'A',n=b-'A'; //把A,B,C柱信息转为0,1,2
int k=-1;
Sleep(2000); //每次输出休息2秒
switch (m){
case 0:ak[0]--;gotoxy(20,38-ak[0]*2);printf(" ");k=temp[0][ak[0]];temp[0][ak[0]+1]=0;break; //把要移动的数字保存到k,同时清零该位置数据
case 1:ak[1]--;gotoxy(30,38-ak[1]*2);printf(" ");k=temp[1][ak[1]];temp[1][ak[1]+1]=0;break;
case 2:ak[2]--;gotoxy(40,38-ak[2]*2);printf(" ");k=temp[2][ak[2]];temp[2][ak[2]+1]=0;break;
}
switch (n){
case 0:ak[0]++;gotoxy(20,40-ak[0]*2);printf("%d",temp[0][ak[0]-1]=k);break;//把移动到的位置数据赋值k,并打印
case 1:ak[1]++;gotoxy(30,40-ak[1]*2);printf("%d",temp[1][ak[1]-1]=k);break;
case 2:ak[2]++;gotoxy(40,40-ak[2]*2);printf("%d",temp[2][ak[2]-1]=k);break;
}
}
void hanoi (int a,char m,char b,char c)
{
if(a==0)return;
hanoi(a-1,m,c,b); //a-1个盘子从m利用c移动到b
move(m,c); //把m中的一个盘子移动到c
hanoi(a-1,b,m,c); //a-1个盘子从b利用m移动到c
}
main()
{
HideCursor();//隐藏光标
gotoxy(x1,y1);
printf("A");for(int i=0;i<9;i++)printf(" ");printf("B");for(int i=0;i<9;i++)printf(" ");printf("C");//打印A,B,C柱
for(int i=0;i<N;i++)
{
gotoxy(20,38-i*2);
printf("%d",i+1);
temp[0][i]=i+1; //temp数组是盘子的坐标信息
ak[0]++;
} //打印初始数字摆放情况
hanoi(N,'A','B','C'); //执行移盘
gotoxy(20,50);
}
[此贴子已经被作者于2018-4-18 10:53编辑过]