17.图形化实现汉诺塔

 

 

 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 }

 

posted @ 2017-12-30 20:56  喵小喵~  阅读(623)  评论(1编辑  收藏  举报