题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/B
题意:
士兵两两之间进行打牌游戏,出牌有规定:双方从首牌依次出起,每一次出的两只牌牌面进行比较,面值大的一方,两只牌归其所有,不过收牌有一定要求,即两只牌要放在自己牌面底端,且先插入对方所出牌面,再插入己方牌面,问:给出双方牌面,判断能否产生输赢,产生输赢后出了几次牌,而谁又能赢?
输入要求:首行输入总牌数,第二行输入士兵甲拥有的牌的数目及每只牌的面值(用空格符分隔),第三行输入士兵乙拥有的牌的数目及每只牌的面值(用空格符分隔);
输出要求:不能产生输赢则直接输出'-1’,否则单行输出出牌次数和赢家(用空格符分隔)。
案例:
Input
4
2 1 3
2 4 2
Output
6 2
Input
3
1 2
2 1 3
Output
-1
图示: 案例一:
案例二:
分析:
这是一个队列问题,可将双方牌面设为两个队列,每一次进行队首元素的比较,入队采用push语句,任一队列为空即结束游戏。具体思路见源代码注释。
源代码:
1 #include<cstdio> 2 #include<queue>//队列的头文件声明 3 using namespace std; 4 int main() 5 { 6 int n,k1,k2,i,m,p1,p2,count,test; 7 while(scanf("%d",&n)!=EOF) 8 { queue<int> q1,q2;//建立两个队列 9 count=0; 10 scanf("%d",&k1); 11 for(i=0;i<k1;i++)//队列q1:元素入队 12 { scanf("%d",&m); 13 q1.push(m); 14 } 15 scanf("%d",&k2); 16 for(i=0;i<k2;i++)//队列q2:元素入队 17 { scanf("%d",&m); 18 q2.push(m); 19 } 20 while(1) 21 { if(q1.empty()||q2.empty())//任一队列为空,结束游戏 22 { test=1;//游戏出牌有限次后结束判别语句 23 break; 24 } 25 else 26 { p1=q1.front();//队列q1首牌数值 27 p2=q2.front();//队列q2首牌数值 28 q1.pop();//队列q1出首牌 29 q2.pop();//队列q2出首牌 30 if(p1>p2)//牌面面值比较 31 { q1.push(p2);//队1赢,两只牌依次入队1 32 q1.push(p1); 33 } 34 else 35 { q2.push(p1);//队2赢,两只牌依次入队2 36 q2.push(p2); 37 } 38 count++;//出牌次数 39 if(count==1e4)//游戏无限循环,无输赢结束判别语句 40 { test=0; 41 break; 42 } 43 } 44 } 45 if(test)//判断能否产生输赢 46 printf("%d %d ",count,q1.empty()?2:1);//判别赢家 47 else printf("-1 "); 48 } 49 return 0; 50 }