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 }

原文地址:https://www.cnblogs.com/xiaochi/p/8151174.html

时间: 2024-11-07 09:46:36

17.图形化实现汉诺塔的相关文章

17.11.9 汉诺塔问题

描述 汉诺塔是约19世纪末,在欧州的商店中出售一种智力玩具.它的结构如下图所示:  在一个平板上立有三根铁针,分别记为A, B, C.开始时,铁针 A 上依次叠放着从大到小 n 个圆盘,游戏的目标就是将 A 上的 n 个圆盘全部转移到 C 上,要求每次只能移动某根铁针最上层一个圆盘,圆盘不得放在这三根铁针以外的任何地方,而且永远只能将小的圆盘叠放在大的圆盘之上. 例如,下面就是示例输出中(n = 3)移动方案的图示: 这是一个著名的问题,几乎所有的教材上都有这个问题.由于条件是一次只能移动一个盘

汉诺塔递归解决方法经典分析

一位法国数学家曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面.僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔.庙宇和众生也都将同归于尽. 虽然这只是一个传说,但也给我们提出了一个问题,

汉诺塔之递归学习

汉诺塔问题: 问题描述引自:http://www.cnblogs.com/antineutrino/p/3334540.html 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘. 思维导图: 程序代码: 1 #

汉诺塔(河内塔)问题:

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘,如图所示: 现在请试着编写一个程序,对于一个有n个盘子的汉诺塔,列举将这n个盘子从柱子A移动到柱子C需要的所有移动步骤,每个步骤占一行. 输入: 3 输出: A-->C A-->B C-->B A-->

堆栈应用(二):汉诺塔

1.问题描述 汉诺塔( Towers of Hanoi)问题来自一个古老的传说:在世界刚被创建的时候有一座钻石宝塔(塔1 ),其上有6 4个金碟(如图 5 - 4所示).所有碟子按从大到小的次序从塔底堆放至塔顶.紧挨着这座塔有另外两个钻石宝塔(塔 2和塔3).从世界创始之日起,婆罗门的牧师们就一直在试图把塔 1 上的碟子移动到塔 2上去,其间借助于塔 3的帮助.由于碟子非常重,因此,每次只能移动一个碟子.另外,任何时候都不能把一个碟子放在比它小的碟子上面.按照这个传说,当牧师们完成他们的任务之后

汉诺塔问题(用栈替代递归)

汉诺塔问题 古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图).有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上.在移动过程中可以利用B座,要求输出移动的步骤. 汉诺塔问题递归解法 C++代码 1 //By LYLtim 2 //2015.2.8 3 4 #include <iostream> 5 6 using namespace std; 7 8 void ha

汉诺塔问题的递归实现

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 1.汉诺塔(基本) 汉诺塔问题是典型的分治算法问题,首先我们来讨论最基本的汉诺塔问题.假设有n个圆盘,三根柱子,a,b,c,需要把n个盘子(从上往下从小到大摞着)从a柱移动到c柱,在小圆盘上不能放大圆盘,在三根柱

4柱汉诺塔(zz)

多柱汉诺塔可以用Frame–Stewart算法来解决. The Frame–Stewart algorithm, giving a presumably optimal solution for four (or even more) pegs, is described below: Let be the number of disks. Let be the number of pegs. Define to be the minimum number of moves required t

汉诺塔问题及其变式

先盗一张图: 正常的汉诺塔问题只要把A柱的所有盘子移动到C柱就好了,可以借助B柱.实现的逻辑如下: void hanoi(int n,char a,char b,char c) { ans++; if(n==1) { cout<<a<<"->"<<c<<endl; return; } hanoi(n-1,a,c,b); cout<<a<<"->"<<c<<en