题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/B
题意:
给一个n(<=10)表示两人手中共有n张牌,接下来一行表示第1个人有k1张牌,k1 v1[1] v1[2]......v1[k1], v1[i]表示第i 张牌的大小,第三行表示第2个人 有k2张牌,k2 v2[1] v2[2].....v2[k2], v2[i]表示第i 张牌的大小。每一轮,两人从牌顶部各出一张,谁出的牌大则两张牌归谁,放入到自己牌的底部,直到其中一个人 手中没有牌出,则那个人输了。问需要多少轮,哪个人赢了。如果没有解则输出-1(k1 + k2 = n)
案例:
1)input
4
2 1 3
2 4 2
output
6 2
2)input
3
1 2
2 1 3
output
-1
思路分析:
利用queue函数。(先进先出)
两个人的牌分为两队分别存入不同的queue类变量,取队首元素进行比较,更小的元素先入队到更大元素的尾部,再让更大的元素入对到它那队的最后,最后让两队的首元素出队。
进行循环,如果其中有一队元素为空,则有人输了,跳出循环,如果循环次数超过了某个很大的数,则不会有结果,输出-1,跳出循环。
如果第一队为空,第二个人赢输出次数和2。如果第二队为空,第一个人赢输出次数和1。
源代码如下:
1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 int main() 5 { 6 int n,k1,k2,i,x1[20],x2[20],m=0; 7 cin>>n; 8 queue<int> q1,q2; 9 cin>>k1; 10 for(i=0;i<k1;i++) 11 { 12 cin>>x1[i]; 13 q1.push(x1[i]); 14 } 15 cin>>k2; 16 for(i=0;i<k2;i++) 17 { 18 cin>>x2[i]; 19 q2.push(x2[i]); 20 } 21 while(1) 22 { 23 m++; 24 if(q1.front()>q2.front()) 25 { 26 q1.push(q2.front()); 27 q1.push(q1.front()); 28 q1.pop(); 29 q2.pop(); 30 } 31 else 32 { 33 q2.push(q1.front()); 34 q2.push(q2.front()); 35 q1.pop(); 36 q2.pop(); 37 } 38 if(q1.empty()||q2.empty())break; 39 if(m>=100000) 40 { 41 cout<<"-1"<<endl;break; 42 } 43 } 44 if(q1.empty())cout<<m<<" 2"<<endl; 45 if(q2.empty())cout<<m<<" 1"<<endl; 46 return 0; 47 }