• 大小: 1.35MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-08-30
  • 语言: C/C++
  • 标签: 汉诺塔  

资源简介

真实再现汉诺塔移动过程。注意:移动的盘子不能太多。

资源截图

代码片段和文件信息

///////////////////////////////////////////////////
// 程序名称:汉诺塔移动动画
// 编译环境:Visual C++ 6.0,EasyX 2011惊蛰版
// 作  者:Ronald         Email:ryl910527@gmail.com
// 最后修改:2011-5-26
//
#include 
#include 
#include 
#define MAX 64 // 圆盘的最大数目
#define NULL 0


// 定义栈
struct STKNODE
{
int a[4];
};

struct STK 
{
STKNODE* stack[MAX];
int top;
};


// 定义全局变量
STK s[3]; // 声明三个栈,分别代表一号二号三号钢针上圆盘的状态
int v = 5; // 调整速度
 


// 函数声明
void Initstk(STK* s); // 初始化栈
void Hannoi(int n char a char b char c); // 汉诺塔递归
void start(); // 开始画面
void Move(int n char a char b); // 移动过程
int switchab(char a); // 返回钢针号
void adjust(); // 调整速度暂停



// 主函数
void main()
{
int n ta[4] = {115 500 285 520}; // 第一个圆盘的位置
printf(“尽量小于16\n“); // 因为大于十六时就会显示有误,但程序可以正常运行
printf(“请输入汉诺塔的层数(1~64):“);
scanf(“%d“ &n);
STKNODE** p;
p = (STKNODE**)malloc(n * sizeof(STKNODE **)); // 声明一个元素为 n 个的动态 STKNODE 型指针数组
for (int i2 = 0; i2 < n; i2 ++)
{
p[i2] = (STKNODE *)malloc(sizeof(STKNODE)); // 为每一个指针申请空间

Initstk(&s[0]);
Initstk(&s[1]);
Initstk(&s[2]); // 将三个栈初始化
start(); // 呈现开始画面
setfillstyle(YELLOW); // 圆盘的颜色
for (int i=0; i < n; i++)
{
ta[0] += 5;
ta[1] -= 20;
ta[2] -= 5;
ta[3] -= 20;
bar(ta[0] ta[1] ta[2] ta[3]); // 画出n个从大到小一次叠放的黄色圆盘
++s[0].top; // 进栈
for (int i1 = 0; i1 < 4; i1++)
{
p[i]->a[i1] = ta[i1];
s[0].stack[s[0].top] = p[i]; // 记录每个矩形的位置,top为圆盘的个数
}
}
Hannoi(n ‘a‘ ‘b‘ ‘c‘); // 汉诺塔递归函数
system(“pause“);
printf(“\t\t\t\tGame Over!\n“);
}



///////////////////////////////////////////////////
// 函数定义

// 汉诺塔的递归
void Hannoi(int n char a char b char c)  
{
if(n == 1)
Move(1 a c);
else
{
Hannoi(n-1 a c b);
Move(n a c);
Hannoi(n-1 b a c);
    }
}

// 栈的初始化
void Initstk(STK *s) 
{  
int i;
s->top = 0;
for (i = 0; i <= MAX; i++)
s->stack[++s->top] = NULL;
s->top = 0;
}

// 移动过程
void Move(int n char a char b)
{
int i3 i4 = 0 i5 = 0;
i3 = b - a; // 目的钢针与源钢针的位置差值
i4 = switchab(a); // 源钢针钢针号
i5 = switchab(b); // 目的钢针号
STKNODE *q1 *q0; // 两个中间结点用于源栈和目的栈间的值得传递,q1为目的栈,q0为源栈
q1 = (STKNODE *)malloc(sizeof(STKNODE));
q0 = (STKNODE *)malloc(sizeof(STKNODE));

// 源栈与目的栈值的传递
q0 = s[i4].stack[s[i4].top];
++s[i5].top; // 进栈
q1->a[0] = q0->a[0] + i3 * 200;
q1->a[1] = 500 - s[i5].top * 20;
q1->a[2] = q0->a[2] + i3 * 200;
q1->a[3] = 500 - s[i5].top * 20 + 20;
s[i5].stack[s[i5].top] = q1;
--s[i4].top; // 出栈

// 向上运动
while (q0->a[1] >= 100)
{
setfillstyle(YELLOW);
bar(q0->a[0] q0->a[1] q0->a[2] q0->a[3]);
adjust(); // 调整函数
Sleep(10 * v); // 暂停(ms)
setfillstyle(WHITE);
bar(q0->a[0] q0->a[1] q0->a[2] q0->a[3]);
setcolor(RED);
line((q0->a[0] + q0->a[

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件     164864  2012-03-09 19:43  汉诺塔移动动画\Debug\vc60.idb

     文件      77824  2012-03-09 19:43  汉诺塔移动动画\Debug\vc60.pdb

     文件     282678  2012-03-09 19:43  汉诺塔移动动画\Debug\汉诺塔.exe

     文件     417748  2012-03-09 19:43  汉诺塔移动动画\Debug\汉诺塔.ilk

     文件      27647  2012-03-09 19:43  汉诺塔移动动画\Debug\汉诺塔.obj

     文件    4008020  2012-03-09 19:43  汉诺塔移动动画\Debug\汉诺塔.pch

     文件     533504  2012-03-09 19:43  汉诺塔移动动画\Debug\汉诺塔.pdb

     文件       9632  2012-03-09 19:43  汉诺塔移动动画\汉诺塔.cpp

     文件       3403  2012-03-09 19:43  汉诺塔移动动画\汉诺塔.dsp

     文件        537  2012-03-09 19:45  汉诺塔移动动画\汉诺塔.dsw

     文件      33792  2012-03-09 19:45  汉诺塔移动动画\汉诺塔.ncb

     文件      48640  2012-03-09 19:45  汉诺塔移动动画\汉诺塔.opt

     文件        748  2012-03-09 19:43  汉诺塔移动动画\汉诺塔.plg

     目录          0  2012-03-09 19:43  汉诺塔移动动画\Debug

     目录          0  2012-03-09 19:45  汉诺塔移动动画

----------- ---------  ---------- -----  ----

              5609037                    15


评论

共有 条评论