若把n个盘子从柱子a通过柱子b移到柱子c,则先把n-1个盘子从柱子a移动柱子b,再把第n个盘子从a移道c,再把n-1个盘子从b移到a。
所以当判断序列是否符合把n个盘子从a移到c时,第n个只能出现在柱子a的最底部,或柱子c的最底部,否则这个序列错的。
当第n个盘子在a的最底部时,则继续判断剩下的序列是否把n-1个盘子从a移到b。
当第n个盘子在c的最底部时,则继续判断剩下的序列是否把n-1个盘子从b移到c。
#include <cstdio>
#define maxn 120
using namespace std;
bool judge(int n,int st[],int ed[],int zh[])
{
if(zh[0]==n) return 0;
else if(st[0]==n) return judge(n-1,st+1,zh,ed);
else if(ed[0]==n) return judge(n-1,zh,ed+1,st);
return 1;
}
int a[maxn],b[maxn],c[maxn];
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
int n;
scanf("%d",&n);
int m;
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&a[i]);
int p;
scanf("%d",&p);
for(int i=0;i<p;i++)
scanf("%d",&b[i]);
int q;
scanf("%d",&q);
for(int i=0;i<q;i++)
scanf("%d",&c[i]);
a[m]=b[p]=c[q]=-1;
if(judge(n,a,c,b)) printf("true\n");
else printf("false\n");
}
return 0;
}