VC++实现模拟汉诺塔效果
VC++实现模拟汉诺塔效果
发布时间:2016-12-28 来源:查字典编辑
摘要:先上效果图再附上源代码:汉诺塔:复制代码代码如下:#include"stdio.h"#include"math.h"intarrA[15],...

先上效果图

VC++实现模拟汉诺塔效果1

再附上源代码:

汉诺塔:

复制代码 代码如下:

#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] = '';

}

// 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 柱nn", 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个盘]nn", 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] = '';

}

// 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 柱nn", 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个盘]nn", n);

drawtower(); // 绘出汉诺塔初始状态

hanoi(n, one, two, three);

printf("n 模拟结束,共移动%ld次n", (long)pow(2, n) - 1);

}

else

{

printf("数据错误!n");

}

}

以上所述就是关于VC++实现汉诺塔效果的全部代码了,希望对大家理解汉诺塔算法能够有所帮助。

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新C语言学习
热门C语言学习
编程开发子分类