实验目的
此代码的作用是求解,即将从小到大、由上至下排序的所有圆盘从A柱子移动到C柱子,每次只能移动最上面的圆盘,大盘子不能在小盘子上面。
本文主要是给c语言初学者或数据结构初学者展示,可以作为简单的参考。除了代码外,本文有部分博主自己对代码的简单分析,可以通过下面的链接免费下载。
代码
#include "stdafx.h"
#include <iostream>
using namespace std;
// 定义2个变量
int m_numOfStack = 0; // 当前栈的数量
int m_current = 0; // 当前计算次数
// 编号为n的圆盘(直径从小到大),从A搬运到C,B作为辅助塔
// 只显示移动步骤
void hanoi(int n,char A,char B,char C)
{
if(n==1) //最后一次移动
{
m_current= m_current +1; // 当前移动次数加1
printf("第%d步:移动圆盘 %d 从柱子 %c 到柱子 %c\n",m_current,n,A,C); // 将编号是1的圆盘从A移到C
}
else // 其他的移动
{
hanoi(n-1,A,C,B); // 将编号从1到n-1的圆盘从A移到B,C作为辅助塔
m_current= m_current +1; // 当前移动次数加1
printf("第%d步:移动圆盘 %d 从柱子 %c 到柱子 %c\n",m_current,n,A,C); // 将编号是n的圆盘从A移到C
hanoi(n-1,B,A,C); // 将编号从1到n-1的圆盘从B移到C,A作为辅助塔
}
}
// 编号为n的圆盘(直径从小到大),从A搬运到C,B作为辅助塔
// 显示步骤和栈中元素数量变化
void hanoiOfStack(int n,char A,char B,char C)
{
m_numOfStack = m_numOfStack + 1;
printf("栈的状态:入栈,当前栈中元素的数量%d\n",m_numOfStack); // 当前栈的情况
if(n==1) //最后一次移动
{
m_current= m_current +1; // 当前移动次数加1
printf("圆盘移动过程(第%d步):移动圆盘 %d 从柱子 %c 到柱子 %c\n",m_current,n,A,C); // 将编号是1的圆盘从A移到C
m_numOfStack = m_numOfStack - 1;
printf("栈的状态:出栈,当前栈中元素的数量%d\n",m_numOfStack); // 当前栈的情况
}
else // 其他的移动
{
hanoiOfStack(n-1,A,C,B); // 将编号从1到n-1的圆盘从A移到B,C作为辅助塔
m_current= m_current +1; // 当前移动次数加1
printf("圆盘移动过程(第%d步):移动圆盘 %d 从柱子 %c 到柱子 %c\n",m_current,n,A,C); // 将编号是n的圆盘从A移到C
m_numOfStack = m_numOfStack - 1;
printf("栈的状态:出栈,当前栈中元素的数量%d\n",m_numOfStack); // 当前栈的情况
hanoiOfStack(n-1,B,A,C); // 将编号从1到n-1的圆盘从B移到C,A作为辅助塔
}
}
// 主函数
int main(int argc, char* argv[])
{
int n;
int flag = 1;
while(flag)
{
printf("\n\n\t\t 1--只显示移动步骤\n");
printf("\t\t 2--显示步骤和栈中元素数量变化\n");
printf("\t\t 0--退出程序\n");
cin >> flag;
switch(flag)
{
case 1: // 只显示移动步骤
{
printf("请输入圆盘数量:\n");
cin >> n;// 获取圆盘数量
printf("\n以下为圆盘移动过程:\n");
m_current = 0; // 初始化移动次数为0
hanoi(n,'A','B','C'); // 执行移动
printf("\n圆盘移动结束,共移动了%d次:\n",m_current);
}
break;
case 2: // 显示步骤和栈中元素数量变化
{
printf("请输入圆盘数量:\n");
cin >> n;// 获取圆盘数量
printf("\n以下为圆盘移动过程和栈中元素数量变化情况:\n");
m_current = 0; // 初始化移动次数为0
m_numOfStack = 0; // 初始化当前栈中元素个数为0
hanoiOfStack(n,'A','B','C'); // 执行移动
printf("\n圆盘移动结束,共移动了%d次:\n",m_current);
}
break;
case 0: // 退出程序
break;
default: // 输入错误
printf("请输入正确的数字\n");
break;
}
}
return 0;
}