又是个坑了我2小时WA到吐的大水题,狗血题目就看了我半天!真是无力吐槽那坑爹的英文题目的描述了。
1.开始以为是几个玩家同步报数匹配,其实是轮流报数匹配,即:A->B->C->D->A->B->C->D->A->B.......
2. 大致流程是:A做一次报数,如果没有match,放回A自己的底部。如果match了,放到B的底部。A做完一次报数后,轮到B报数(注意只有当B有牌时才报数),如果没有match,放回B自己的底部。如果match了,放到C的底部; 再到C报数。。。。依次循环下去
3.维护几个queue即可。
#include <iostream>
#include<queue>
#include<cstring>
using namespace std;
queue<int>que[11];
int callnum[11];
int fina[11];
int T,player,num,ter;
int main()
{
cin>>T;
int yy=1;
while(T--)
{
bool flag=false;
cin>>player;
fill(que,que+player,queue<int>());
memset(callnum,0,sizeof(callnum));
memset(fina,0,sizeof(fina));
for (int i=0;i<52;i++)
{
cin>>num;
que[0].push(num);
}
int c=0;
int aa=0;
for (;;)
{
c++;
if(c>100000) {flag=true; break;}
//terminated situation
ter=0;
for (int i=0;i<player;i++)
{
if(que[i].empty())
ter++;
}
if(ter==player) break;
aa=aa%player;
if(!que[aa].empty())
{
callnum[aa]=callnum[aa]%13;
callnum[aa]=callnum[aa]+1;
int temp=que[aa].front();
que[aa].pop();
if (temp==callnum[aa])
{
if (que[aa].size()==0)
{
fina[aa]=temp;
}
que[aa+1].push(temp);
}
else
que[aa].push(temp);
}
aa++;
}
if(flag==true) cout<<"Case "<<yy++<<": unwinnable"<<endl;
else
{
cout<<"Case "<<yy++<<": ";
for (int i=0;i<player-1;i++)
{
cout<<fina[i]<<" ";
}
cout<<fina[player-1]<<endl;
}
}
return 0;
}