J钓鱼 (vector + queue)

HR的OJ!

Description

外出比赛是一个漫长的旅程,所以小明带了很多副扑克牌,然而他找不到两个想要打牌的队友,所以一个人玩起了接竹竿。

接竹竿的规则就是,当一个人出的牌在上面的牌中有一样数字的,则他可以将这两个牌和两牌之间的牌拿走,然后再出一张扑克。

玩接竹竿的时候,他的左手先出牌,他所赢的牌是按照以前的顺序出的。

比如:小明的左手剩了1,2两张牌,然后他只有上一步赢了一次,是2,3,4,2 那么他的出牌顺序就是1,2,2,3,4,2。

当一个人手中没牌时,则另一个人胜利。

小明玩着玩着,发现这个游戏的输赢在开始分牌的时候就已经确定了,于是,他就没有耐心玩下去了,他就写了一个小程序来判断是左手赢还是右手赢,相信作为一个程序猿/媛,你也可以的呦。

Input

第一行一个数T,代表小明玩了T次游戏。

每次游戏开始是一个数n,表示小明只用了数字<=n的扑克,

后面有两行数字,每行有2*n个数,第一行代表开始游戏时左手的扑克。

第二行代表开始游戏时右手的扑克。

扫描二维码关注公众号,回复: 565356 查看本文章

1 <= T <= 10

1 <= n <= 13

Output

对于每次游戏,输出游戏的结果,结果分为左手赢,右手赢和平局

(左右手累积出牌十万次不分输赢)

每次游戏输出占一行,左手赢输出1,右手赢输出2,平局输出0。

Sample Input

2
1
1 1
1 1
2
1 1 1 2
1 2 2 2

Sample Output

0
2

写在前面,纪念一下自己的傻逼~~~

比赛的时候犯了个错误:

for(it; it < ve.end(); it++) {     //这里用的 it 。下面你还咋删除???
        que_right.push(*it);    
    }
    que_right.push(t);
    ve.erase(it, ve.end());   //经过上面的循环,it == ve.end(), 还删除个毛! ac...

思路:

这道题不难就是队列vector模拟

AC:

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<queue>
#include<vector>
#define N 100005
using namespace std;
int inf = 0x3f3f3f3f;
double eps = 1e-5;
vector<int> ve;
queue<int>que_left, que_right;
vector<int>::iterator it, it1;
int flag; // 标记哪只手出牌,1:表示左手, 0:表示右手 
void play(int x) {
    if(x == 1) {    //如果左手出牌 
        int t = que_left.front();
        que_left.pop();
        if(ve.empty()) {    //如果vecotr为空,直接加入 
            ve.push_back(t);
            flag = 0;   //交换 
        }else {
            it = find(ve.begin(), ve.end(), t); //看出过的牌有没有相同的
            it1 = it;
            if(it == ve.end()) {
                ve.push_back(t);
                flag = 0;
            }else {
                for(it1; it1 < ve.end(); it1++) {   //比赛的时候这里用的是 it
                    que_left.push(*it1);
                }
                que_left.push(t);
                ve.erase(it, ve.end());     //循环过后 it 改变。erase发生错误
            }

        } 
    }else{
        int t = que_right.front();
        que_right.pop();
        if(ve.empty()) {
            ve.push_back(t);
            flag = 1;
        }else {
            it = find(ve.begin(), ve.end(), t);
            it1 = it;
            if(it == ve.end()) {
                ve.push_back(t);
                flag = 1;
            }else {
                for(it1; it1 < ve.end(); it1++) {   //比赛的时候这里用的是 it  
                    que_right.push(*it1);
                }
                que_right.push(t);
                ve.erase(it, ve.end());     //循环换过后 it 改变。erase发生错误 
            }

        }

    }
}
int main() {
//  freopen("in.txt", "r", stdin);
    int t;
    scanf("%d", &t);
    while(t--) {
        while(!que_left.empty()) {   
            que_left.pop();
        }
        while(!que_right.empty()) {
            que_right.pop();
        }
        ve.clear();
        int n;
        scanf("%d", &n);
        int left, right;
        for(int i = 1; i <= n * 2; i++) {
            scanf("%d", &left); 
            que_left.push(left);
        }
        for(int i = 1; i <= n * 2; i++) {
            scanf("%d", &right);
            que_right.push(right);
        }
        int round = 0;
        flag = 1;   // 标记哪只手出牌,1:表示左手, 0:表示右手
//      printf("round = %d que_left = %d que_right = %d\n",round, que_left.size(), que_right.size());
        while(!que_left.empty() && !que_right.empty() && round <= 1e5) {
            play(flag);
            round++;
//      printf("round = %d ve.size = %d que_left = %d que_right = %d\n",round, ve.size(), que_left.size(), que_right.size());
        }
        if(que_left.empty()) {
            printf("2\n");
        }else if(que_right.empty()) {
            printf("1\n");
        }else{
            printf("0\n");
        }   
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/henuyh/article/details/80172091