链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=93
利用栈来模拟过程:
AC code:
#include <iostream>
#include <stack>
using namespace std;
int main()
{
int test,p,q,i,x,y,flag;
cin>>test;
while (test--)
{
flag=1;
stack<int> a,b,c;
int temp1,temp2;
cin>>p>>q;
for(p;p>=1;p--)
a.push(p);
for(i=0;i<q;++i)
{
cin>>x>>y;
//先判断是否可以移动,被移动针是否为空
if(x==1)
{
if(a.empty()) { flag=0; continue;}
if(!a.empty()) { temp1=a.top(); a.pop();}
switch (y)
{
case 2: if(!b.empty()) { temp2=b.top(); if(temp1>temp2) flag=0;b.push(temp1);} else if(b.empty()) b.push(temp1); break;
case 3: if(!c.empty()) { temp2=c.top(); if(temp1>temp2) flag=0;c.push(temp1);} else if(c.empty()) c.push(temp1); break;
}
}
else if(x==2)
{
if(b.empty()) {flag=0; continue;}
if(!b.empty()) { temp1=b.top(); b.pop();}
switch (y)
{
case 1: if(!a.empty()) { temp2=a.top(); if(temp1>temp2) flag=0;a.push(temp1);} else if(a.empty()) a.push(temp1); break;
case 3: if(!c.empty()) { temp2=c.top(); if(temp1>temp2) flag=0;c.push(temp1);} else if(c.empty()) c.push(temp1); break;
}
}
else if(x==3)
{
if(c.empty()) {flag=0; continue;}
if(!c.empty()) {temp1=c.top(); c.pop();}
switch (y)
{
case 1: if(!a.empty()) { temp2=a.top();if(temp1>temp2) flag=0;a.push(temp1);} else if(a.empty()) a.push(temp1); break;
case 2: if(!b.empty()) { temp2=b.top();if(temp1>temp2) flag=0;b.push(temp1);} else if(b.empty()) b.push(temp1); break;
}
}
}
if(!flag) cout<<"illegal"<<endl;
else cout<<"legal"<<endl;
}
}