每天一算法(双色河内塔又叫汉诺塔)

说明

双色河内塔是由之前所介绍过的河内塔规则衍生而来,双色河内塔的目的是将下图左上的圆环位置经移动成为右下的圆环位置:《每天一算法(双色河内塔又叫汉诺塔)》

解法

双色河内塔或是原始的河内塔,其解法观念与之前介绍过的河内塔是类似的,同样也是使用递回来解,不过这次递回解法的目的不同,我们来看双色的情况,这很简单,
只要将第一柱的黄色移动至第二柱,而接下来第一柱的蓝色移动至第三柱。再来是四个盘的情况,首先必须用递回完成下图左上至右下的移动:

《每天一算法(双色河内塔又叫汉诺塔)》

接下来最底层的就不用管它们了,因为它们已经就定位,只要再处理第一柱的上面两个盘子就可以了。那么六个盘的情况呢?一样!首先必须用递回完成下图左上至右下的移动:

《每天一算法(双色河内塔又叫汉诺塔)》

接下来最底层的就不用管它们了,因为它们已经就定位,只要再处理第一柱上面的四个盘子就可以了,这又与之前只有四盘的情况相同,接下来您就知道该如何进行解题了,无论是八个盘、十个盘以上等,都是用这个观念来解题。

简单的写一下程序:

//将在B中最底下的两个,,上边一个移动到C
void Move1(char B,char C)
{
	cout<<"将一个从"<<B<<"移动到"<<C<<endl;
}
//将n个从A移动到C
void Move2(int n,char A,char B,char C)
{
	if (n<1)
	{
		return ;
	}
	
	if (1 == n)
	{
		cout<<"将两个从"<<A<<"一个一个移动到"<<C<<endl;
	}
	else
	{
		Move2(n-1,A,C,B);
		Move2(1,A,B,C);
		Move2(n-1,B,A,C);
	}
	
}

void Move3(int n)
{
	if (n == 1)
	{
		Move2(1,'A','C','B');
		Move1('B','C');
		return;
	}
	

	Move2(n-1,'A','B','C');
	Move2(1,'A','C','B');
	Move2(n-1,'C','B','A');
	Move1('B','C');
	Move3(n-1);
	
}

int main()
{
	Move3(4);
}
    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/Heaven13483/article/details/8330503
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞