先上效果图
再附上源代码:
汉诺塔:
#include "stdio.h" #include "math.h" int arrA[15], arrB[15], arrC[15]; // 分别为A、B、C int length; int lenA, lenB, lenC; char plate[32]; // Make void makeplate(int n) { int i; if (n == length + 1) { for (i = 0; i < 2 * length + 3; i++) { if (i == length + 1) { plate[i] = '|'; } else { plate[i] = '_'; } } } else { if (n == 0) { for (i = 0; i < 2 * length + 3; i++) { if (i == length + 1) { plate[i] = '|'; } else { plate[i] = ' '; } } } else { for (i = 0; i < 2 * length + 3; i++) { if (i == length + 1) { plate[i] = '|'; } else { if (i >= length + 1 - n && i <= length || i > length + 1 && i <= length + 1 + n) { plate[i] = '_'; } else { plate[i] = ' '; } } } } } plate[i] = '\0'; } // Draw void drawtower() { int i; printf(" "); for (i = length; i >= 0; i--) { if (i <= lenA) { makeplate(arrA[i]); printf("%s", plate); } else { makeplate(0); printf("%s", plate); } if (i <= lenB) { makeplate(arrB[i]); printf("%s", plate); } else { makeplate(0); printf("%s", plate); } if (i <= lenC) { makeplate(arrC[i]); printf("%s", plate); } else { makeplate(0); printf("%s", plate); } printf("\n "); } } // Move void moveplate(int n, char x, char y) { int i, j; if (x == 'A') { lenA--; } else { if (x == 'B') { lenB--; } else { lenC--; } } if (y == 'A') { lenA++; arrA[lenA] = n; } else { if (y == 'B') { lenB++; arrB[lenB] = n; } else { lenC++; arrC[lenC] = n; } } drawtower(); // 绘出移动一次后汉诺塔的状态 } // Print And Move void printandmove(int n, char x, char y) { printf("\n %d 号盘从 %c 柱移到 %c 柱\n\n", n, x, y); moveplate(n, x, y); } // Hanoi void hanoi(int n, char one, char two, char three) { if (n == 1) { printandmove(n, one, three); } else { hanoi(n - 1, one, three, two); printandmove(n, one, three); hanoi(n - 1, two, one, three); } } // Main void main() { int n, i; // n为汉诺塔盘子数,如要改变,只需更改初始值即可。 char one = 'A', two = 'B', three = 'C'; printf("请输入盘子个数[1—12]:"); scanf("%d", &n); if (n >= 1 && n <= 12) { length = n; lenA = n; for (i = 0; i <= lenA; i++) { arrA[i] = n + 1 - i; } lenB = lenC = 0; arrB[0] = arrC[0] = n + 1; printf(" 汉诺塔模拟移动过程[%d个盘]\n\n", n); drawtower(); // 绘出汉诺塔初始状态 hanoi(n, one, two, three); printf("\n 模拟结束,共移动%ld次\n", (long)pow(2, n) - 1); } else { printf("数据错误!\n"); } }
汉诺塔.c
/* 汉诺塔模拟 2013-5-13 */ #include "stdio.h" #include "math.h" int arrA[15], arrB[15], arrC[15]; // 分别为A、B、C int length; int lenA, lenB, lenC; char plate[32]; // Make void makeplate(int n) { int i; if (n == length + 1) { for (i = 0; i < 2 * length + 3; i++) { if (i == length + 1) { plate[i] = '|'; } else { plate[i] = '_'; } } } else { if (n == 0) { for (i = 0; i < 2 * length + 3; i++) { if (i == length + 1) { plate[i] = '|'; } else { plate[i] = ' '; } } } else { for (i = 0; i < 2 * length + 3; i++) { if (i == length + 1) { plate[i] = '|'; } else { if (i >= length + 1 - n && i <= length || i > length + 1 && i <= length + 1 + n) { plate[i] = '_'; } else { plate[i] = ' '; } } } } } plate[i] = '\0'; } // Draw void drawtower() { int i; printf(" "); for (i = length; i >= 0; i--) { if (i <= lenA) { makeplate(arrA[i]); printf("%s", plate); } else { makeplate(0); printf("%s", plate); } if (i <= lenB) { makeplate(arrB[i]); printf("%s", plate); } else { makeplate(0); printf("%s", plate); } if (i <= lenC) { makeplate(arrC[i]); printf("%s", plate); } else { makeplate(0); printf("%s", plate); } printf("\n "); } } // Move void moveplate(int n, char x, char y) { int i, j; if (x == 'A') { lenA--; } else { if (x == 'B') { lenB--; } else { lenC--; } } if (y == 'A') { lenA++; arrA[lenA] = n; } else { if (y == 'B') { lenB++; arrB[lenB] = n; } else { lenC++; arrC[lenC] = n; } } drawtower(); // 绘出移动一次后汉诺塔的状态 } // Print And Move void printandmove(int n, char x, char y) { printf("\n %d 号盘从 %c 柱移到 %c 柱\n\n", n, x, y); moveplate(n, x, y); } // Hanoi void hanoi(int n, char one, char two, char three) { if (n == 1) { printandmove(n, one, three); } else { hanoi(n - 1, one, three, two); printandmove(n, one, three); hanoi(n - 1, two, one, three); } } // Main void main() { int n, i; // n为汉诺塔盘子数,如要改变,只需更改初始值即可。 char one = 'A', two = 'B', three = 'C'; printf("请输入盘子个数[1—12]:"); scanf("%d", &n); if (n >= 1 && n <= 12) { length = n; lenA = n; for (i = 0; i <= lenA; i++) { arrA[i] = n + 1 - i; } lenB = lenC = 0; arrB[0] = arrC[0] = n + 1; printf(" 汉诺塔模拟移动过程[%d个盘]\n\n", n); drawtower(); // 绘出汉诺塔初始状态 hanoi(n, one, two, three); printf("\n 模拟结束,共移动%ld次\n", (long)pow(2, n) - 1); } else { printf("数据错误!\n"); } }
以上所述就是关于VC++实现汉诺塔效果的全部代码了,希望对大家理解汉诺塔算法能够有所帮助。
本文向大家介绍C语言实现汉诺塔游戏,包括了C语言实现汉诺塔游戏的使用技巧和注意事项,需要的朋友参考一下 操作就是:A B 号码A的塔顶一层放在号码B的塔顶。如1(空格) 3 回车。 话说有人能把我这C的代码添加到QT界面框架上去么? 代码写的不好 ,维护性不够,只能玩8层的,写完以后发现很难拓展,软件工程,设计模式有待提高.... 里面提示输入等级的装B用了,没有实现,大家随便输入个个位数就可以
本文向大家介绍C++ 实现汉诺塔的实例详解,包括了C++ 实现汉诺塔的实例详解的使用技巧和注意事项,需要的朋友参考一下 C++ 实现汉诺塔的实例详解 前言: 有A,B,C三塔,N个盘(从小到大编号为1-N)起初都在A塔,现要将N个盘全部移动到C塔(按照河内塔规则),求最少移动次数以及每次的移动详细情况。 要求: 需要采用递归方法和消除尾递归两种方法编写。 盘数N由用户从标准输入读入,以一个整数表示
主要内容:分治算法解决汉诺塔问题,汉诺塔问题的代码实现汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则: 每次只能移动柱子最顶端的一个圆盘; 每个柱子上,小圆盘永远要位于大圆盘之上; 图 1 给您展示了包含 3 个圆盘的汉诺塔问题: 图 1 汉诺塔问题 一根柱子上摞
汉诺塔是由法国数学家爱德华·卢卡斯在 1883 年发明的。他的灵感来自一个传说,有一个印度教寺庙,将谜题交给年轻的牧师。在开始的时候,牧师们被给予三根杆和一堆 64 个金碟,每个盘比它下面一个小一点。他们的任务是将所有 64 个盘子从三个杆中一个转移到另一个。有两个重要的约束,它们一次只能移动一个盘子,并且它们不能在较小的盘子顶部上放置更大的盘子。牧师日夜不停每秒钟移动一块盘子。当他们完成工作时,
本文向大家介绍android实现模拟加载中的效果,包括了android实现模拟加载中的效果的使用技巧和注意事项,需要的朋友参考一下 最近闲着没事做了一个Android小程序,具体如下: 效果图: 原始界面 点击按钮运行 运行后界面 实现代码: 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。
本文向大家介绍Java使用递归法解决汉诺塔问题的代码示例,包括了Java使用递归法解决汉诺塔问题的代码示例的使用技巧和注意事项,需要的朋友参考一下 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图)。 有一个和尚想把这n个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在