题目链接: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 }

 

        

posted on 2015-07-22 21:34  尘埃。  阅读(399)  评论(0编辑  收藏  举报