程序设计C语言-递归(汉诺塔)

来源:互联网 发布:等身抱枕 淘宝 编辑:程序博客网 时间:2024/05/17 01:02
#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("==================================");}

0 0