- 将n个盘子从A柱经B柱移动到C柱:首先将其余的n-1个盘子移动到B柱,然后第n个盘子直接移动到C柱。
- 故第n个盘子只出现在A柱和C柱两个柱子上,即第n个盘子不可能出现在B柱上。
- 递归地实现其余n-1个盘子
AC代码:
#include<iostream>
using namespace std;
int m,p,q,big=0;
int a[65],b[65],c[65];
bool is_han(int r,int n,int i,int j,int k)
{
if(!n)
return 1;
//确定最大盘所在的柱子 (每个柱子上的盘从大到小输入)
if(i<m&&a[i]==n)
big=1,i++;
if(j<p&&b[j]==n)
big=2,j++;
if(k<q&&c[k]==n)
big=3,k++;
// r为最大盘错误的位置
if(big==r)
return 0;
return is_han(6-r-big,n-1,i,j,k); /* 假设上一个最大盘要从A经B到C,则下一个最大盘要从A经C到B;
确定下一个最大盘的错误位置:不是上一个最大盘的错误位置,
也不是上一个最大盘的位置,且 6=1+2+3 ( 3个柱子表示的
位置分别记为1,2,3) */
}
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
cin>>m;
for(int i=0;i<m;i++)
cin>>a[i];
cin>>p;
for(int i=0;i<p;i++)
cin>>b[i];
cin>>q;
for(int i=0;i<q;i++)
cin>>c[i];
if(is_han(2,n,0,0,0))
puts("true");
else
puts("false");
}
}