首页 > 其他分享 >汉诺塔的非递归实现

汉诺塔的非递归实现

时间:2022-09-28 22:36:42浏览次数:41  
标签:head 递归 实现 move ++ -- int 汉诺塔 printf

借助堆栈以非递归(循环)方式求解汉诺塔的问题(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

相关文章