汉诺塔C语言(带注释)
- 格式:docx
- 大小:13.06 KB
- 文档页数:2


#ifndef HANIO_H_
#define HANIO_H
class Stack
{
private:
enum{ MAX=50 };
int m_node[MAX];
int m_top;
int m_size;
int m_index;
public:
Stack();
~Stack() { };
bool Isfull() { return m_top==MAX-1 ;}; //堆栈满则返回TRUE
bool Isempty() { return m_top==-1;}; //堆栈空则返回TRUE
int Top() { return m_top; };
int TopValue() { return m_node[m_top];};
int GetDataFromIndex(int i) { return m_node[i]; };
int GetIndex() { return m_index; } ;
void SetIndex(int index) { m_index = index; };
int Size() { return m_top+1; };
bool Push(int data);
bool Pop(int * pData);
int MoveToNext();
void OutPrint();
};
class Hanio
{
Stack m_stack[3];
int m_num; //盘数
int m_steps; //移动次数
int m_times; //完成所用时间
void print(char ch,int n);
public:
Hanio(int num=3);
~Hanio() {};
汉诺塔问题是一个经典的递归问题。在汉诺塔问题中,有三根柱子,第一根柱子上从下到上放着 n 个盘子,目标是将这些盘子从第一根柱子移动到第三根柱子上,并且只能每次移动一个盘子,并且不能将一个较大的盘子放在较小的盘子上面。
以下是一个使用 C 语言实现的汉诺塔问题的示例代码:
```c
#include
void hanoi(int n, char A, char B, char C) {
if (n == 1) {
printf("Move disk 1 from %c to %c\n", A, C);
return;
}
hanoi(n - 1, A, C, B);
printf("Move disk %d from %c to %c\n", n, A, C);
hanoi(n - 1, B, A, C);
}
int main() {
int n = 3; // 盘子数量
hanoi(n, 'A', 'B', 'C'); // 调用递归函数,将盘子从 A 柱子移动到 C 柱子,B 柱子作为辅助柱子
return 0;
}
```
在这个代码中,我们定义了一个 `hanoi` 函数来递归地解决汉诺塔问题。在 `hanoi` 函数中,我们首先检查盘子数量是否为 1,如果是,则直接将盘子从起始柱子移动到目标柱子。否则,我们使用两个辅助柱子来将 n-1 个盘子从起始柱子移动到第二个辅助柱子上,然后将最后一个盘子从起始柱子移动到目标柱子上,最后再将 n-1 个盘子从第二个辅助柱子移动到目标柱子上。
在 `main` 函数中,我们定义了盘子数量 n,并调用了
`hanoi` 函数来解决问题。
#ifndef HANIO_H_
#define HANIO_H
class Stack
{
private:
enum{ MAX=50 };
int m_node[MAX];
int m_top;
int m_size;
int m_index;
public:
Stack();
~Stack() { };
bool Isfull() { return m_top==MAX-1 ;}; ush(i);
utPrint();
}
void Hanio::print(char ch,int n)
{
for(int i=1;i<=n;i++)
std::cout<
}
void Hanio::DrawPaletes(char ch)
{
int max;
max=m_stack[0].Size()>m_stack[1].Size() ? m_stack[0].Size() :
m_stack[1].Size(); max=m_stack[2].Size()>max ? m_stack[2].Size() :
max;
etIndex(max-1);
m_stack[1].SetIndex(max-1);
m_stack[2].SetIndex(max-1);
for(int i=1;i<=max;i++)
{
int data1=m_stack[0].MoveToNext();
int data2=m_stack[1].MoveToNext();
int data3=m_stack[2].MoveToNext();
if(data1==0)
print(' ',20);
else
{
print(' ',10-data1);
print(ch,2*data1);
汉诺塔实现步骤
一、创建工作空间和应用(略)
二、创建结构体对象(str_disk)
其中str_表示structure, disk就是圆盘.
三、创建用户对象(u_tower)
其中u_表示UserObject,选PB Object中的custom visual. (1)操作界面
(2)设计控件
(3)控件名称
(4)部分控件不可见
(5)声明实例变量
其中 roundrectangle irr_disk[14]定义栈空间(空栈)
int ii_count栈顶指针(栈内盘子数)
(6)编写 constructor事件代码
作用:在空栈中放置栈元素(盘子)
//将14个圆角矩形控件对象加到数组中
//即初始化栈
//其结果数组元素irr_disk[1]-- irr_disk[14] 分别对应存放的是对象rr_1--rr_14。
int li_index
int li_array_limit
int li_control_index
int li_control_limit
string rr_name
drawobject ldo_temp
li_array_limit = upperbound (irr_disk[])//返回数组维界
li_control_limit = upperbound (control[])//返回控件数组维界
//将控件数组里的隐藏矩形,放置在定义的实例对象数组中。
For li_control_index = 1 to li_control_limit
//对控件数组的每个元素
ldo_temp = control[li_control_index]
rr_name= ldo_temp.classname()
li_index=dec(right(rr_name,len(rr_name)-3))
If li_index>=1 and li_index<=