这题也没什么好难的,就是一个点:
什么时候才能断定是永远平局,其实逻辑上讲是发现队列的状态有循环出现,那么就是永远不能跳出循环,但是不可能每次队列状态改变都去判断一下,又因为这题n非常小,所以随便定义一个循环的极限次数即可,比如10000,如果10000次都挑不出来那么可以断定答案是-1.
代码:
//A
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define MAXN 20
int main()
{
int i;
int n,k1,k2;
queue<int> q1,q2;
int c1,c2;
int flag,temp;
int cnt,win;
while(scanf("%d",&n)!=EOF)
{
while(!q1.empty())
q1.pop();
while(!q2.empty())
q2.pop();
scanf("%d",&k1);
for(i=1;i<=k1;i++)
{
scanf("%d",&c1);
q1.push(c1);
}
scanf("%d",&k2);
for(i=1;i<=k2;i++)
{
scanf("%d",&c2);
q2.push(c2);
}
temp=n*n*n*n;
flag=win=cnt=0;
while(temp--)
{
if(q1.empty())
{
flag=1;
win=2;
break;
}
if(q2.empty())
{
flag=1;
win=1;
break;
}
cnt++;
c1=q1.front();
q1.pop();
c2=q2.front();
q2.pop();
if(c1>c2)
{
q1.push(c2);
q1.push(c1);
}
else if(c1<c2)
{
q2.push(c1);
q2.push(c2);
}
}
if(flag==0)
printf("%d\n",-1);
else
printf("%d %d\n",cnt,win);
}
return 0;
}