题目大意:
如题所述
解题思路:
参考网上的解析。对于借助B柱从A柱移到C柱的汉诺塔,考虑第n个盘的移动:前n-1个盘移至B柱后,将第n个盘直接套在C柱底部,因此这个过程中第n个盘不可能出现在B柱。当第n个盘没有移错时再考虑第n-1个盘,此时有两种情况:
1.如果第n个盘在A柱上,那么前n-1个盘处于从A柱经过C柱移向B的过程,因此第n-1个盘不可能出现在C柱。
2.如果第n个盘在C柱上,那么前n-1个盘处于从B柱经过A柱移向C的过程,因此第n-1个盘不可能出现在A柱。
以此类推,递归求解,递归出口为n==0或盘出现错误时。
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int flag;
void DFS(int n,int A[70],int B[70],int C[70])
{
if(n==0)
{
flag=1;
return;
}
if(B[0]&&n==B[1])
{
flag=0;
return;
}
if(A[0]&&n==A[1])
{
A[1]=A[0]-1;
DFS(n-1,++A,C,B);
}
else if(C[0]&&n==C[1])
{
C[1]=C[0]-1;
DFS(n-1,B,A,++C);
}
}
int main()
{
int T,n,i;
int A[70],B[70],C[70];
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
scanf("%d",&A[0]);
for(i=1;i<=A[0];i++)
{
scanf("%d",&A[i]);
}
scanf("%d",&B[0]);
for(i=1;i<=B[0];i++)
{
scanf("%d",&B[i]);
}
scanf("%d",&C[0]);
for(i=1;i<=C[0];i++)
{
scanf("%d",&C[i]);
}
DFS(n,A,B,C);
if(flag)
printf("true\n");
else
printf("false\n");
}
return 0;
}