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

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; } }

你可能感兴趣的:(汉诺塔变形问题;开拓你的思维;)