第一篇博文祭汉诺塔;
此道汉诺塔耗时悠久,浪费了很多时间。最后还是请教同学才过的,所以第一道题当然要祭奠下它了;
题解:
汉诺塔中第n个盘子有可能存在初始柱start,和目标柱target,就是不可能存在中间转移n-1盘子的中间柱forbit。嗯,分析两种可能,1.如果n在初始柱,那么要将n-1盘放到中间柱,则n的初始柱start就是n-1的初始柱start,而n的中间柱forbit就是n-1的目标柱target,n的目标柱就是n-1的中间柱forbit。2.如果n在目标柱,则说明n-1已经到达前个目标柱,n-1的初始柱为n-1已到达的目标柱(暨n的中间柱),则n的目标柱target为n-1的目标柱target,而n的中间柱forbit,为n-1的初始柱start,n的初始柱start,为n-1的中间柱forbit。
代码如下:
#include<stdio.h>
int a[70];
int f1(int n,int start,int target,intforbit)
{ int i,k,j;
if(n>0)
{
if(a[n]==forbit)
return 0;
else if(a[n]==start)
{ j=f1(n-1,start,forbit,target);
if(j)
return 1;
else return 0;
}
else
{ j=f1(n-1,forbit,target,start);
if(j)
return 1;
else return 0;
}
}
else return 1;
}
int main()
{ int i,k,j,l,c,b;
int m,n;
scanf("%d",&m);
for(i=0;i<m;i++)
{scanf("%d",&n);
for(k=0;k<3;k++)
{ scanf("%d",&b);
for(j=0;j<b;j++)
{ scanf("%d",&c);
a[c]=k;
}
}
l=f1(n,0,2,1);
if(l)
printf("true\n");
else printf("false\n");
}
return 0;
}