题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=93
解题思路:
用3个栈来保存盘即可。。。然后判断栈移出时是否为空,移入时判断当前栈顶盘编号是否小于要移入的盘。
代码如下:
#include<cstdio>
#include<algorithm>
#include<stack>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int ncase;
int total, ope;
int from, to;
bool flag;
scanf("%d", &ncase);
while(ncase--)
{
stack<int> a[4];
while(!a[1].empty())
a[1].pop();
while(!a[2].empty())
a[2].pop();
while(!a[3].empty())
a[3].pop();
flag = true;
scanf("%d %d", &total, &ope);
for(int i = total; i >= 1; --i)
a[1].push(i);
for(int i = 0; i < ope; ++i)
{
scanf("%d %d", &from, &to);
if(a[from].empty())
{
flag = false;
break;
}
if(!a[to].empty() && (a[to].top() < a[from].top()))
{
flag = false;
break;
}
a[to].push(a[from].top());
a[from].pop();
}
puts(flag ? "legal" : "illegal");
}
return 0;
}