#include <stdio.h>
#include <stdlib.h>
/*汉诺塔经典问题,递归操作,适用于100阶以内的汉诺塔问题*/
int ary1[100], ary2[100], ary3[100]; //定义全局变量
int N;//定义阶数
int times;//定义计数器
int main() {
void print_hanoi(void);
printf("几阶汉诺塔: ");
scanf_s("%d", &N, 1);
times = 0;//计数器置零
for (int i = 1;i <= N;i++) {//汉诺塔A塔赋值
ary1[i] = i;
ary2[i] = 0;
ary3[i] = 0;
}
void move(int n, int x[100], int y[100], int z[100]);//声明移动函数
/*输出未移动的汉诺塔*/
print_hanoi();
printf("\n 已移动\t%d\t次\t\t按Enter键继续下一步", times);
if (getchar() == '\n');
/*输出移动一次的汉诺塔,ps:不知道为啥,没办法在move函数里实现,估计是键入几阶的‘\n’被识别为下一步的标记了*/
print_hanoi();
printf("\n 已移动\t%d\t次\t\t按Enter键继续下一步", times);
if (getchar() == '\n');
move(N,ary1,ary2,ary3);//调用移动函数
print_hanoi();
printf("\n已完成移动,共移动\t%d\t次\t\t按Enter键退出", times);
if (getchar() == '\n');
return 0;
}
void move(int n, int x[100], int y[100], int z[100]) {
if (n > 1) {
move(n - 1, x, z, y);
z[n] = x[n];
x[n] = 0;
times += 1;//操作一次,计数器加一
print_hanoi();
printf("\n 已移动\t%d\t次\t\t按Enter键继续下一步", times);
if (getchar() == '\n');
move(n - 1, y, x, z);
}
else {
z[1] = x[1];
x[1] = 0;
times += 1;//操作一次,计数器加一
print_hanoi();
printf("\n 已移动\t%d\t次\t\t按Enter键继续下一步", times);
if (getchar() == '\n');
}
}
void print_hanoi(void) {
system("CLS");
for (int i = 1;i <= N;i++) {
printf("\t");
if (ary1[i] != 0)printf("%d ", ary1[i]);
printf("\t");
if (ary2[i] != 0)printf("%d ", ary2[i]);
printf("\t");
if (ary3[i] != 0)printf("%d ", ary3[i]);
printf("\n");
}
printf("==================================");
}
程序设计C语言-递归(汉诺塔)
最新推荐文章于 2022-03-23 12:45:59 发布