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;
}