#include <stdio.h>
#define STEPPING 1
#define MAX_LEVEL 10
typedef struct
{
int index;
int numbers[MAX_LEVEL];
int count;
} Column;
Column A, B, C;
int steps;
void init(int levels_count)
{
steps = 0;
A.count = B.count = C.count = 0;
A.index = 1;
B.index = 2;
C.index = 3;
for (int number = levels_count; number > 0; --number)
{
A.numbers[A.count] = number;
A.count++;
B.numbers[number] = C.numbers[number] = 0;
}
}
int top(Column* src)
{
return src->numbers[src->count - 1];
}
void push(Column *dst, int number)
{
dst->numbers[dst->count] = number;
++dst->count;
}
void pop(Column *src)
{
src->numbers[src->count - 1] = 0;
--src->count;
}
void draw_cell(int number)
{
if (number > 0)
{
printf("\t~%02d~\t\t|", number);
}
else
{
printf("\t \t\t|");
}
}
void draw()
{
int row_count = A.count;
if (row_count < B.count)
{
row_count = B.count;
}
if (row_count < C.count)
{
row_count = C.count;
}
for (int i=row_count-1; i >= 0; --i)
{
draw_cell(A.numbers[i]);
draw_cell(B.numbers[i]);
draw_cell(C.numbers[i]);
printf("\n");
}
printf("\t----------------------------------------------\n");
}
void move(int pile, Column *src, Column *tmp, Column *dst)
{
if (pile == 1)
{
int number = top(src);
printf("\n第%d步:(%d号盘) 柱%d ==> 柱%d\n", ++steps, number, src->index, dst->index);
#if STEPPING
printf("按任意键执行...\n");
getchar();
#endif
pop(src);
push(dst, number);
draw();
return;
}
move(pile-1, src, dst, tmp);
move(1, src, tmp, dst);
move(pile - 1, tmp, src, dst);
}
int main()
{
int levels = 0;
printf("请输入汉诺塔共几层(1~10):");
scanf("%d", &levels);
if (levels <= 0 || levels > 10)
{
printf("非法的层数:%d。", levels);
return -1;
}
getchar();
init(levels);
printf("初始状态:\n");
draw();
move(levels, &A, &B, &C);
printf("\n======[大功告成]=======\n");
printf("[%d层]汉诺塔移动完成,共%d步。\n", levels, steps);
return 0;
}