您的位置:首页 > 其它

汉诺塔变形问题;开拓你的思维;

2010-04-11 11:30 1011 查看
Hanoi塔的问题

题目描述:
Hanoi塔的问题相信大家很熟悉了:有三根针上放了一些圆盘,
半径各不相同,大的不能放在小的上面,每次只能移动一个,
要把它们全部移到第三根针上
输入:
多组测试数据,每组两行。第一行是n(1<=n<=32),表示有多少个盘接下来一行由n个数字1,2,3组成的数字串,
第一个数表示最大的盘在第几根针上,第二个数表示次大的盘在第几根针上,第n个数表示最小的盘在第几根针上,
输入的n为0的时候结束
输出:
全部移动到第三根针上所需要的最少步数
样例输入:
3
111
3
321
0

样例输出:
7
2

#include <iostream>
using namespace std;

int sHanoi[33];//表示将i个盘从一根针移动到目标针上的最少步数
int iDisk[33];//表示i盘在iDisk[i]针上

int hanoi(int iCount,int iAim)//将iCount个盘子移动到目标盘iAim上
{
if(iCount==0)//0个盘子不需要移动
{
return 0;
}
else if(iDisk[iCount]==iAim)//如果iCount盘子在目标针,那么只需要将iCount-1个盘子移动到目标针
{
return hanoi(iCount-1,iAim);
}
else
{
return hanoi(iCount-1,6-iDisk[iCount]-iAim)+1+sHanoi[iCount-1];//如果iCount盘子不在目标针,则要把iCount-1个盘子都移动到另外一根针上,然后将iCount盘移动到目标针,然后将另外一根针上的
//icount-1个盘子全部移到目标针, 将n个盘子从一根针移动到另一根针的最少移动步数是固定值。
}
}

void main()
{
int iCount;
int iAim=3;
for(int i=1;i<=32;i++)
{
sHanoi[i]=sHanoi[i-1]*2+1;//这里为什么要这样算呢? 因为如下:
//以3个盘子为例 ,将3个盘子移动到第三根针,则要把上边的2个盘子移动到第二根针,由于第三个盘子最大,不会影响上边2个盘子的移动,所以上边两个盘子移动到第二根针的步数就是
//sHanoi[2],上边2个移动到第二根针以后还要把第三个盘子移动到针3,只需要一步,所以sHanoi[2]+1, 然后还要把第二根针上的2个盘子移到第三根针上,这个过程也不受第三个盘子的影响,所以
//也是sHanoi[2],所以总共移动了2sHanoi[2]+1=sHanoi[3]
}

while(cin>>iCount&&iCount!=0)
{
for(int i=iCount;i>=1;i--)
{
cin>>iDisk[i];
}
cout<<hanoi(iCount,3)<<endl;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  测试