#include<stdio.h>
#include<stdlib.h>
#define N 7
#define X dish[i].dnum
#define Y dish[i].lnum
#define SP dish[i].peg
int mov1(int,int);//向右挪一步
int mov2(int,int);//向右挪两步
struct dish
{
int dnum; //自身编号
int lnum; //下面的盘子
int peg; //所在的柱子
}dish[N];
int s[3]={N};//初始化每个柱的状态为空
void main()
{
int n;
int i,change=1,j;
for(i=0;i<N;i++)
{
dish[i].dnum=i; //作为盘子的唯一标识,顶层为0,最高级的最大盘子为N-1
dish[i].lnum=i+1; //底层盘子的下一层为N,即空柱
dish[i].peg=0; //初始化,所有盘子都在0柱
}
printf("请选择汉诺塔层数(1~7):");
scanf("%d",&n);
s[0]=0; //当前0柱上最顶端的盘子值
while(s[0]<N || s[1]<N)
{
j=0;
for(i=0;s[j]!=N || i<n;i++) //不为空柱则向下找盘子
{
if((n%2==0 && X%2==0)||(n%2==1 && X%2==1))
change=mov1(SP,X);
else change=mov2(SP,X);
if(!change)
{
if(s[0]<N && s[1]<N && s[2]<N)
{
for(int k=0;s[k]!=0;k++);
j=k;
}
else j=(j+1)%3; //该柱上没有盘子可以移动则更换柱子
}
}
}
}
int mov1(int sp,int x)
{ printf("\nmove1\n");
if(s[(sp+1)%3]>x)//要移动的目标是可以承载当前盘子的
{
printf("%d %d --> %d\n",x,sp,(sp+1)%3);
s[dish[x].peg]=dish[x].lnum; //x盘所在柱子减去当前盘,顶盘变为x盘的下一个
dish[x].lnum=s[(dish[x].peg+1)%3]; //x盘的落点即x转移后的下面的盘
s[(dish[x].peg+1)%3]=dish[x].dnum; //x盘转移到的柱子顶盘值变为x盘值
dish[x].peg=(dish[x].peg+1)%3; //x盘所在柱子变为落点柱子
return 1; //转移成功
}
else return 0; //转移失败
}
int mov2(int sp,int x)
{ printf("\nmove2\n");
if(s[(sp+2)%3]>x)//要移动的目标是可以承载当前盘子的
{
printf("%d: %d --> %d\n",x,sp,(sp+2)%3);
s[dish[x].peg]=dish[x].lnum; //x盘所在柱子减去当前盘,顶盘变为x盘的下一个
dish[x].lnum=s[(dish[x].peg+2)%3]; //x盘的落点即x转移后的下面的盘
s[(dish[x].peg+2)%3]=dish[x].dnum; //x盘转移到的柱子顶盘值变为x盘值
dish[x].peg=(dish[x].peg+2)%3; //x盘所在柱子变为落点柱子
return 1; //转移成功
}
else return 0; //转移失败
}
运行结果