先上效果图
再附上源代码:
汉诺塔:
复制代码 代码如下:
#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");
}
}
#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");
}
}
/* 汉诺塔模拟
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++实现汉诺塔效果的全部代码了,希望对大家理解汉诺塔算法能够有所帮助。
相关文章
猜你喜欢
- 个人服务器网站搭建:如何选择合适的服务器提供商? 2025-06-10
- ASP.NET自助建站系统中如何实现多语言支持? 2025-06-10
- 64M VPS建站:如何选择最适合的网站建设平台? 2025-06-10
- ASP.NET本地开发时常见的配置错误及解决方法? 2025-06-10
- ASP.NET自助建站系统的数据库备份与恢复操作指南 2025-06-10