1 #define _CRT_SECURE_NO_WARNINGS 2 3 #include <stdlib.h> 4 #include <stdio.h> 5 #include <stdarg.h>//标准参数 6 7 int a[10][3] = { 0 }; 8 int buzou = 1;//表示步骤数 9 10 //初始化 11 void init(int a[10][3],int num) 12 { 13 for (int i = 0; i < num; i++) 14 { 15 a[9 - i][0] = num - i; 16 } 17 } 18 19 //显示 20 void show(int a[10][3]) 21 { 22 printf("%5c%5c%5c\n", ‘A‘, ‘B‘, ‘C‘); 23 printf("----------------------\n"); 24 for (int i = 0; i < 10; i++) 25 { 26 for (int j = 0; j < 3; j++) 27 { 28 printf("%5d", a[i][j]); 29 } 30 printf("\n\n"); 31 } 32 } 33 34 //移动圆盘 35 void move(char src, char des) 36 { 37 int from_id = src - 65;//从第几根柱子移动的? 38 int to_id = des - 65; 39 int from_num = 0;//要移动的数字是什么? 40 //找到from_id从上到下第一个圆盘的数字 41 for (int i = 0; i < 10; i++) 42 { 43 if (a[i][from_id] != 0) 44 { 45 from_num = a[i][from_id]; 46 a[i][from_id] = 0; 47 break; 48 } 49 } 50 //找到to_id从下到上第一个为0的位置,并把盘子移上去 51 for (int i = 9; i >= 0; i--) 52 { 53 if (a[i][to_id] == 0) 54 { 55 a[i][to_id] = from_num; 56 break; 57 } 58 } 59 } 60 61 //汉诺塔 62 void hanno(int n, char A, char B, char C) 63 { 64 if (n == 1) 65 { 66 printf("第%d步:", buzou++); 67 printf("%c----->%c\n", A, C); 68 move(A, C); 69 show(a); 70 } 71 else 72 { 73 hanno(n - 1, A, C, B); 74 printf("第%d步:\n", buzou++); 75 printf("%c----->%c\n", A, C); 76 move(A, C); 77 show(a); 78 hanno(n - 1, B, A, C); 79 } 80 } 81 82 83 void main() 84 { 85 int count;//圆盘数量 86 printf("请输入圆盘数量(1-10)之间:"); 87 scanf("%d", &count); 88 init(a, count); 89 show(a); 90 hanno(count, ‘A‘, ‘B‘, ‘C‘); 91 system("pause"); 92 }
原文地址:https://www.cnblogs.com/xiaochi/p/8151174.html
时间: 2024-11-07 09:46:36