汉诺塔的相关问题的处理,如下代码如何完成呢?
并给出相应的代码注释,谢谢了
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
#include <Windows.h>
struct H
{
int data[15];/*存放每个盘的代号*/
int top;/*每个塔的具体高度*/
}num[3];/*三个塔*/
void move(char x, char y, struct H num[3]);/*移动的具体过程*/
void hanoi(char x, char y, char z, int n, struct H num[3]);/*递归*/
void Init(void);/*初始化*/
void Close(void);/*图形关闭*/
int computer = 1;/*自动控制与手动控制的标志*/
int speed = 0;/*全局变量speed主要是演示过程的速度*/
void main(void)
{
Init();/*初始状态*/
Close();/*图形关闭*/
exit(0);
}
void Init(void)/*初始化*/
{
int i, n, color;
system("cls");
printf("please input n(n<=10): ");/*输入要演示的盘子数*/
scanf("%d", &n);
printf("Please input 1 or 2:\n1.computer 2.people\n");
scanf("%d", &i);
if (i == 2)/*选择手动控制标志为0*/
computer = 0;
if (n < 1 || n>10)
n = 10;/*越界的话n当10处理*/
if (computer)/*如果是自动控制的话输入速度*/
{
printf("please input speed: ");/*输入速度*/
scanf("%d", &speed);
}
initgraph(640, 480);
cleardevice();
for (i = 0; i < 3; i++)
num[i].top = -1;/*三个地方的高度开始都为-1*/
for (i = 0; i < n; i++)/*画一开始的塔座A上的盘子*/
{
num[0].top++;/*栈的高度加1*/
num[0].data[num[0].top] = i; /*最大的盘子代号为0,依次为1,2,…n-1*/
color = num[0].data[num[0].top] + 1;/*盘子的颜色代码为栈顶盘子代号加1*/
setfillstyle(SOLID_FILL, color);
bar(100 - (33 - 3 * num[0].data[num[0].top]), 400 - 20 * i - 8, 100 +
(33 - 3 * num[0].data[num[0].top]), 400 - 20 * i + 8); /*画矩形*/
}
setcolor(YELLOW);
outtextxy(180, 450, "any key to continue");
LOGFONT f;
gettextstyle(&f);// 获取当前字体设置
f.lfHeight = 48;// 设置字体高度为 48
_tcscpy(f.lfFaceName, _T("黑体"));// 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数)
f.lfQuality = ANTIALIASED_QUALITY;// 设置输出效果为抗锯齿
settextstyle(&f);// 设置字体样式
outtextxy(90, 420, "A"); /*塔座标志*/
outtextxy(240, 420, "B");
outtextxy(390, 420, "C");
_getch();/*接收字符后就执行递归操作*/
hanoi('a', 'b', 'c', n, num);
}
void move(char x, char y, struct H num[3])/*移动的具体过程*/
{
}
void hanoi(char one, char two, char three, int n, struct H num[3])/*递归n为盘子数,num为堆栈*/
{
}
void Close(void)/*图形关闭*/
{
_getch();
closegraph();
}