一道普通的模拟题,就是一个扑克游戏,挺有意思的,看了下题解发现他的做法有点不太整洁,就把自己的代码贴出来了。
对于模拟题嘛,主要就是用各个函数来模拟某一块的功能,如果平时写一些小游戏,写这种题比较简单。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int N;
const int MAXTIME = 100000;
class CardDesk{//这个类代表桌子上的牌,就是二者出的牌
public:
int a[30];
int top;
bool used[30];
CardDesk(){
top = 0;
memset(used,false,sizeof(used));
}
void clear(){
top = 0;
memset(used,false,sizeof(used));
}
bool have(int x){
return used[x];
}
int Getpos(int x){
for(int i=1;i<=top;++i){
if(a[i] == x)
return i;
}
return 0;
}
void push(int x){
a[++top] = x;
used[x] = true;
}
};
class CardDesk Main;
bool popCard(queue<int> &q){//模拟出牌的过程
int x = q.front();q.pop();
if(Main.have(x)){
int pos = Main.Getpos(x);
for(int i=pos;i<=Main.top;++i){
q.push(Main.a[i]);
}
q.push(x);
for(int i=pos;i<=Main.top;++i){
Main.used[Main.a[i]] = false;
}
Main.top = pos-1;
return true;
}
else{
Main.push(x);
return false;
}
}
int solve(){
Main.clear();
scanf("%d",&N);
int a;
queue<int> l,r;
for(int i=1;i<=2*N;++i){
scanf("%d",&a);
l.push(a);
}
for(int i=1;i<=2*N;++i){
scanf("%d",&a);
r.push(a);
}
int Time = 0;
while(true){
bool f;
do{
f = popCard(l);
Time++;
if(Time == MAXTIME)//这要放在里面判断
return 0;
}while(f);
if(l.size() == 0)
return 2;
do{
f = popCard(r);
Time++;
if(Time == MAXTIME)
return 0;
}while(f);
if(r.size() == 0)
return 1;
}
return 0;
}
int main(void){
int T;
scanf("%d",&T);
for(int Case = 1;Case <= T;++Case){
printf("%d\n",solve());
}
return 0;
}