#include<list>
#include<iostream>
using namespace std;
const int N=1000;
list<int> v[3];
void init(int n)
{
for(int i=0;i!=3;i++)
v[i].assign(1,1000);
for(int i=n;i>0;i--)
v[0].push_back(i);
}
int main()
{
int n,P,Q,a,b;
cin>>n;
while(n--)
{
bool illegal=false;
cin>>P>>Q;
init(P);
while(Q--)
{
cin>>a>>b;
if(illegal) continue;
if(v[a-1].empty()) {illegal=true;continue;}
if(v[a-1].back()>=v[b-1].back()){ illegal=true; continue; } ;
list<int>::iterator it=v[a-1].end();
v[b-1].splice(v[b-1].end(),v[a-1],--it);
}
cout<<(illegal?"illegal":"legal")<<endl;
}
}
在我们把三根针编号为1,2,3。
所有的金片在初始时都在1号针上,现在给你的任务是判断一系列的指令过程中,是否会出现非法的指令。
而非法指令有以下两种情况:
1、某个针上已经没有金片了,但是指令依然要求从该处移动金片到其它针上。
2、把一个大的金片移动到了小的金片上。
-
输入
-
第一行输入一个整数N表示测试数据的组数(N<10)
每组测试数据的第一行有两个整数P,Q(1<P<64,1<Q<100),分别表示汉诺塔的层数与随后指令的条数
随后的Q行,每行都输入两个整数a,b,(1<=a,b<=3)表示一条指令。
指令1 2表示把1号针最上面的金片移动到2号针最上面。
数据保证a,b不会相同。
输出
-
如果存在非法指令,请输出illegal
不存在非法指令则输出legal
样例输入