#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
//定义柱子结构体,来存放柱子数据
struct hannuo
{
int a[100];//存放盘子
int tag = -1;//标记,记录柱子存放的盘子数量
char name;//柱子名称
};
int main()
{
struct hannuo b[3];//定义一个结构体数组,存放三根柱子
int n,next,targ=2;
printf("请输入n值:");
scanf("%d",&n);
char colname[3] = {'A', 'B', 'C'};
for(int i=0; i<3; i++)
{
// b[i].tag = -1;
b[i].name = colname[i];
// printf("%c ", b[i].name);
//记录当前柱子的盘子数目
if(i==0){
for(int j=0,k=n;j<n;j++,k--){
b[i].a[j] = k;
b[i].tag++;
}
}
}
//当盘子数为基数时,第二根与第三根柱子交换,即目标柱子交换
if(n % 2 !=0)
{
struct hannuo temp;
temp = b[1];
b[1] = b[2];
b[2] = temp;
targ = 1;
}
while(b[targ].tag!=(n-1))//当所有盘子移到第三根柱子上结束
{
for(int i=0;i<3 && b[targ].tag!=(n-1);i++) //对三根柱子进行遍历
{
next=i+1;
for(int j=0;j<2 && b[targ].tag!=(n-1);j++ ) //当前柱子盘子移动最多次数为2次
{
//判断是否溢出,当数组下标大于或者等于3,next为0
if(next>=3)
{
next = 0;
}
else
{
next = next;
}
//当第一根柱子有盘子时,并且第二根柱子为空时或者第二根柱子盘子大于第一根柱子盘子,将第一根柱子里的盘子移到第二根柱子上
if(b[i].tag!=-1 && (b[next].tag==-1 || b[i].a[b[i].tag]<b[next].a[b[next].tag]))
{
printf("%d from %c to %c\n",b[i].a[b[i].tag],b[i].name,b[next].name);
//当前下一根柱子盘子标记进行累计加1
b[next].tag++;
//将当前柱子的盘子移到当前下一根柱子上
b[next].a[b[next].tag] = b[i].a[b[i].tag];
//当前柱子盘子标记进行累计减1
b[i].tag--;
}
//当前柱子有盘子,继续将盘子移到下一根柱子
else if(b[next].tag!=-1)
{
printf("%d from %c to %c\n",b[next].a[b[next].tag],b[next].name,b[i].name);
//当前柱子盘子标记进行累计加1
b[i].tag++;
b[i].a[b[i].tag] = b[next].a[b[next].tag];
b[next].tag--;
}
next++;
}
}
}
printf("Hello World");
return 0;
}
用迭代实现汉诺塔
最新推荐文章于 2023-09-11 10:56:20 发布