C语言实践答辩 ,求注释。明天答辩了,什么都不懂的小白一个,抽到汉诺塔的编程。求跟完整的注释
#include<stdio.h>#include<stdlib.h>#include<windows.h>intDISK_NUM;//总盘数int*disk[3];//...
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int DISK_NUM; //总盘数
int *disk[3]; //盘子分布信息
int diskNum[3]; //每柱现有盘数
const char* COLUMN_NAMES = "abc"; //柱名称,显示时转换,运算时用0/1/2
void move(int from,int offset,int to);
void show(int step,int from,int to,int diskNo);
int main()
{
int i;
printf("欢迎使用汉诺塔文字动画演示程序\n\n");
printf("请输入盘片数量:");
scanf("%d",&DISK_NUM);
//初始化盘分布
//盘片按从下至上的顺序排列,分别保存在disk[i]
//最初盘片全部排列在0柱
for(i=0;i<3;i++)
disk[i] = (int*)malloc(DISK_NUM * sizeof(int));
for(i=0; i<DISK_NUM; i++)
disk[0][i] = DISK_NUM - i;
diskNum[0] = DISK_NUM;
diskNum[1] = diskNum[2] = 0;
show(0,0,0,0); //初始显示
move(0,0,2); //将所有盘子自0柱移至2柱
for(i=0;i<3;i++)
free(disk[i]);
return 0;
}
COORD coord = {0, 3};
void show(int step,int from,int to,int diskNo)
{
#define BAR_CHAR '-'
int i,j,k,col;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
for(i=0; i<DISK_NUM; i++) //按行循环
{
col = DISK_NUM - 1 - i; //盘子保存顺序与显示顺序相反,处理一下
printf(" ");
for(j=0; j<3; j++) //按柱循环
{
for(k=0; k<DISK_NUM*2+1; k++) //按显示位置循环
{
printf("%c",col<diskNum[j] && k>=(DISK_NUM-disk[j][col]) && k<=(DISK_NUM+disk[j][col]) ? BAR_CHAR : ' ');
}
}
printf("\n");
}
if(step > 0)
printf("step%3d: %2d. %c -> %c\n",step,diskNo+1,COLUMN_NAMES[from],COLUMN_NAMES[to]);
Sleep(500);
}
void move(int from,int offset,int to)
{
static int step = 0;
int tmp = 3 - from - to; //第三柱编号
int num = diskNum[from] - offset; //要移动的盘数
int current; //当前移动的盘编号,用于显示
if(num == 1) //仅移动一片,直接移动
{
current = disk[to][diskNum[to]++] = disk[from][--diskNum[from]];
step++;
show(step,from,to,current);
}
else
{
move(from,offset+1,tmp);
move(from,offset,to);
move(tmp,diskNum[tmp] - (num-1),to);
}
} 展开
#include <stdlib.h>
#include <windows.h>
int DISK_NUM; //总盘数
int *disk[3]; //盘子分布信息
int diskNum[3]; //每柱现有盘数
const char* COLUMN_NAMES = "abc"; //柱名称,显示时转换,运算时用0/1/2
void move(int from,int offset,int to);
void show(int step,int from,int to,int diskNo);
int main()
{
int i;
printf("欢迎使用汉诺塔文字动画演示程序\n\n");
printf("请输入盘片数量:");
scanf("%d",&DISK_NUM);
//初始化盘分布
//盘片按从下至上的顺序排列,分别保存在disk[i]
//最初盘片全部排列在0柱
for(i=0;i<3;i++)
disk[i] = (int*)malloc(DISK_NUM * sizeof(int));
for(i=0; i<DISK_NUM; i++)
disk[0][i] = DISK_NUM - i;
diskNum[0] = DISK_NUM;
diskNum[1] = diskNum[2] = 0;
show(0,0,0,0); //初始显示
move(0,0,2); //将所有盘子自0柱移至2柱
for(i=0;i<3;i++)
free(disk[i]);
return 0;
}
COORD coord = {0, 3};
void show(int step,int from,int to,int diskNo)
{
#define BAR_CHAR '-'
int i,j,k,col;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
for(i=0; i<DISK_NUM; i++) //按行循环
{
col = DISK_NUM - 1 - i; //盘子保存顺序与显示顺序相反,处理一下
printf(" ");
for(j=0; j<3; j++) //按柱循环
{
for(k=0; k<DISK_NUM*2+1; k++) //按显示位置循环
{
printf("%c",col<diskNum[j] && k>=(DISK_NUM-disk[j][col]) && k<=(DISK_NUM+disk[j][col]) ? BAR_CHAR : ' ');
}
}
printf("\n");
}
if(step > 0)
printf("step%3d: %2d. %c -> %c\n",step,diskNo+1,COLUMN_NAMES[from],COLUMN_NAMES[to]);
Sleep(500);
}
void move(int from,int offset,int to)
{
static int step = 0;
int tmp = 3 - from - to; //第三柱编号
int num = diskNum[from] - offset; //要移动的盘数
int current; //当前移动的盘编号,用于显示
if(num == 1) //仅移动一片,直接移动
{
current = disk[to][diskNum[to]++] = disk[from][--diskNum[from]];
step++;
show(step,from,to,current);
}
else
{
move(from,offset+1,tmp);
move(from,offset,to);
move(tmp,diskNum[tmp] - (num-1),to);
}
} 展开
1个回答
展开全部
推荐你看这篇文章,其实就是层层回推的一个过程.
http://www.360doc.com/content/13/0121/20/10086564_261627221.shtml
追问
我是想要上面那个注释
我是想要上面那个注释
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询