借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。
输入格式:
输入为一个正整数N,即起始柱上的盘数。
输出格式:
每个操作(移动)占一行,按柱1 -> 柱2
的格式输出。
1. 将三根柱子按顺序排成品字型,若 n 为偶数,按顺时针方向依次摆放A、B、C;若 n 为奇数,按顺时针方向依次摆放A、C、B。
2. 把圆盘1从现在的柱子移动到顺时针方向的下一根柱。
3. 接着,把另外两根柱上可以移动的圆盘移动到新的柱上(事实上只有唯一的选择)。
4. 如果没有达到目标要求,则返回步骤2。
#include<iostream>
#include<string>
using namespace std;
int move(int *x,int head_x,int *y,int head_y)
{
if(y[head_y]>x[head_x]&&head_x!=0)
{
y[++head_y]=x[head_x];
return true;
}
else
{
return false;
}
};//移动圆盘
int main()
{
int a[10000]={0};
int b[10000]={0};
int c[10000]={0};
a[0]=9999;b[0]=9999;c[0]=9999;
int head_a=0,head_b=0,head_c=0;
int n,i,j;
cin>>n;
for(i=1;i<=n;i++)
{
a[i]=n-i+1;
}
head_a=n;
if(n%2==1)//n为奇数
{
for(;;)
{
if(move(a,head_a,c,head_c))
{
head_a--,head_c++;printf("a -> c\n");
}//1,a到c
if(move(a,head_a,b,head_b))
{
head_a--,head_b++;printf("a -> b\n");
}
else
{
if(move(b,head_b,a,head_a))
{
head_b--,head_a++;printf("b -> a\n");
}
}//a到b或b到a
if(head_a==0&&head_b==0)
{
break;
}//如果完成,结束,否则进入下一轮
if(move(c,head_c,b,head_b))
{
head_c--,head_b++;printf("c -> b\n");
}
if(move(a,head_a,c,head_c))
{
head_a--,head_c++;printf("a -> c\n");
}
else
{
if(move(c,head_c,a,head_a))
{
head_c--,head_a++;printf("c -> a\n");
}
}
if(head_a==0&&head_b==0)
{
break;
}//
if(move(b,head_b,a,head_a))
{
head_b--,head_a++;printf("b -> a\n");
}
if(move(b,head_b,c,head_c))
{
head_b--,head_c++;printf("b -> c\n");
}
else
{
if(move(c,head_c,b,head_b))
{
head_c--,head_b++;printf("c -> b\n");
}
}
if(head_a==0&&head_b==0)
{
break;
}
}
}
else
{
for(;;)
{
if(move(a,head_a,b,head_b))
{
head_a--,head_b++;printf("a -> b\n");
}
if(move(a,head_a,c,head_c))
{
head_a--,head_c++;printf("a -> c\n");
}
else
{
if(move(c,head_c,a,head_a))
{
head_c--,head_a++;printf("c -> a\n");
}
}
if(head_a==0&&head_b==0)
{
break;
}//
if(move(b,head_b,c,head_c))
{
head_b--,head_c++;printf("b -> c\n");
}
if(move(a,head_a,b,head_b))
{
head_a--,head_b++;printf("a -> b\n");
}
else
{
if(move(b,head_b,a,head_a))
{
head_b--,head_a++;printf("b -> a\n");
}
}
if(head_a==0&&head_b==0)
{
break;
}//
if(move(c,head_c,a,head_a))
{
head_c--,head_a++;printf("c -> a\n");
}
if(move(b,head_b,c,head_c))
{
head_b--,head_c++;printf("b -> c\n");
}
else
{
if(move(c,head_c,b,head_b))
{
head_c--,head_b++;printf("c -> b\n");
}
}
if(head_a==0&&head_b==0)
{
break;
}
}
}
return 0;
}
标签:head,递归,实现,move,++,--,int,汉诺塔,printf From: https://www.cnblogs.com/iceforever7/p/16739811.html