汉诺塔(三)
题目来源:点击打开链接
题目信息:这道题也是模拟栈的操作,用数组栈表示三根针,先将所有的金片全部放到一号针上,然后用栈的基本操作模拟金片的指令,定义一个k作为标记,判断是否合法。
源代码:
#include<stdio.h>
#include<stack>
using namespace std;
int main()
{
int n;
int p,q;
int a,b;
scanf("%d",&n);
while(n--)
{
stack<int>S[4]; //定义数组栈,这里需要注意,和数组一样,需要定义的比实际大些。
scanf("%d%d",&p,&q);
int i;
for(i=p;i>0;i--)
S[1].push(i); //将所有金片初始在1号针上
int k=1; //定义一个标记
for(i=1;i<=q;i++)
{
scanf("%d%d",&a,&b);
if(S[a].empty()) //非法指令1
{
k=0;
break;
}
if(!S[b].empty()&&S[a].top()>S[b].top()) //非法指令二
{
k=0;
break;
}
S[b].push(S[a].top());
S[a].pop();
}
if(k==0)
printf("illegal\n");
else
printf("legal\n");
}
return 0;
}