首先,什么是汉诺塔?如题,简单的介绍一下:在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
1、汉诺塔的路径代码实现:
如果不明白汉诺塔的路径是怎么移的,可以运行以下代码进行模拟:
#include
void hanoi(int n,char A,char B,char C)
{
if(n==1)
{
printf("%c---->%c\n",A,C);
}
else
{
hanoi(n-1,A,C,B);
printf("%c---->%c\n",A,C);
hanoi(n-1,B,A,C);
}
}
int main()
{
int n;
scanf ("%d",&n);
hanoi(n,'A','B','C');
return 0;
}
2、汉诺塔(一)
汉诺塔的最少步数:
这个问题属于递推的问题,n个圆盘所需步数f(n)的递推式:f(n)=2*f(n-1)+1,。如果把f(n)的值从小到大列出来:1、2、7、15、31、63、127、255……你会发现其实有一个简单的表达式:f(n)=2^n-1.该推论可以用数学归纳法证明,这里不再证明。
代码如下:
#include
int b_mod(int a,int n,int m)
{
if(n==0) return 1;
int x=b_mod(a,n/2,m);
long long ans=(long long)x*x%m;
if(n%2==1)
ans=ans*a%m;
return (int)ans;
}
int main()
{
int cas,n,answer;
scanf("%d",&cas);
while(cas--)
{
scanf("%d",&n);
answer=b_mod(2,n,1000000);
answer-=1;
printf("%d\n",answer);
}
return 0;
}
2、汉诺塔(三)
运用栈容器,问题的判断条件已经给出:
1、某个针上已经没有金片了,但是指令依然要求从该处移动金片到其它针上。
2、把一个大的金片移动到了小的金片上。
代码如下:
#include
#include
#include
using namespace std;
int main()
{ int cas,floor,step,from,to,flag;
scanf("%d",&cas);
while(cas--)
{ flag=1;
stacka[4];
while(!a[1].empty())
a[1].pop();
while(!a[2].empty())
a[2].pop();
while(!a[3].empty())
a[3].pop();
scanf("%d%d",&floor,&step);
int i,j;
for(i=floor;i>=1;i--)
a[1].push(i);
while(step--)
{
scanf("%d%d",&from,&to);
if(a[from].empty()||(!a[to].empty()&&a[from].top()>a[to].top()))
{
flag=0;
break;
}
else
{
a[to].push(a[from].top());
a[from].pop();
}
}
if(flag)
printf("legal\n");
else
printf("illegal\n");
}
return 0;
}