写练习题的时候遇到这道题,是道简单的模拟题,然后就直接写了两个队列进行模拟,写着写着发觉有问题,还需要标记模拟过程中产生的新队列,于是赶紧修改代码,在想如何标记的时候尝试了很多中方法,其中不乏该题最水的ac方法,即循环足够多的次数可以ac。最后我用了map对每个新队列进行标记。
题目大意:两个人打牌,从自己的手牌中抽出最上面的一张比较大小,大的一方可以拿对方的手牌以及自己打掉的手牌重新作为自己的牌,放在自己手牌的最下方,而且对方输掉的那张手牌需要放在上面,自己赢的手牌放在下面。输入数据看题目网址,附链接:http://codeforces.com/contest/546/problem/C。
大体思路:简单模拟,用两个队列进行模拟,然后用map数组标记出现过的序列。如果新序列和以前某个序列一样,则输出-1。具体代码如下:
#include<iostream>
#include<string>
#include<queue>
#include<map>
using namespace std;
queue<int> q1,q2;
map<queue<int>,queue<int> > m;
int main(){
int n;
cin>>n;
int k1,k2;
cin>>k1;
int a;
for(int i=0;i<k1;i++){
cin>>a;
q1.push(a);
}
cin>>k2;
for(int i=0;i<k2;i++){
cin>>a;
q2.push(a);
}
m[q1]=q2;
int cnt=0;
while(!q1.empty()&&!q2.empty()){
int first=q1.front();
q1.pop();
int second=q2.front();
q2.pop();
if(first<second){
q2.push(first);
q2.push(second);
}
else{
q1.push(second);
q1.push(first);
}
cnt++;
if(m.count(q1)&&m[q1]==q2){
/*一开始我用的是m[q1]=q2,不过过不了,然后直接用m.count(q1),也wa了,最后两个结合才ac
具体还不知道什么原因,初步估计是map本身的问题,以后有机会我会对map进行一下实验,
这里注释,免得自己忘了*/
cnt=-1;
break;
}
else
m[q1]=q2; //记录新的序列
}
if(cnt==-1)
cout<<-1<<endl;
else{
cout<<cnt;
if(q1.empty())
cout<<' '<<2<<endl;
else
cout<<' '<<1<<endl;
}
return 0;
}
![微笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/smile.gif)