队列模拟 1003. Hit or Miss
纸牌游戏,有N个玩家,开始游戏时,第一位玩家将会按输入顺序获得一叠牌。其它玩家的牌堆为空
游戏开始时,每个玩家依次行动,若玩家牌堆为空,则跳过其操作。若玩家牌堆不为空,则他要执行两个步骤,1.数数(从1开始,到13之后又变回1) 2.若数的数字与牌堆顶的数字相同,则将该牌置于他的下一个玩家的排队底,若下一个玩家为最后一个玩家,则将此牌扔掉。若数字与牌堆堆底的数字不同,则将该牌置于堆底。
执行N轮之后,若所有人的牌堆均为空,则游戏胜利,输出每个人手上拿的最后一张牌的数字。
若游戏无法结束,则输出一串英文。(无法结束判断条件:可用一个较大的N,若连续N次没有出现传牌操作,则可判定这个游戏无法结束,即出现了牌在某个人或某几个人中死循环的情况。)
#include <iostream>
#include <queue>
using namespace std;
int last_num[11];
int main(){
int Case,player_num,tag,temp;
cin >> Case ;
for( int k=0; k<Case; ++k)
{
cin >> player_num;
int card_left = 52;
int counter;
queue<int> q[10];
tag = 1;
for( int i=0; i<52; ++i ){
cin >> temp;
q[0].push(temp);
last_num[i] = 0;
}
temp = 0;
tag = 1;
while( card_left != 0 ){
temp++;
if( temp == 13*52 )
{
tag = 0;
break;
}
for( int i=0; i<player_num; ++i )
{
counter = last_num[i];
counter++;
if( counter == 14 ) counter = 1;
if( !q[i].empty() && q[i].front() == counter ){
if( i != player_num-1 ){
q[i+1].push( q[i].front());
}
else
{
card_left--;
}
last_num[i] = q[i].front();
if( q[i].size() == 1 ) result[i] = q[i].front();
q[i].pop();
last_num[i] = counter;
temp = 0;
}
else if( !q[i].empty() && counter != q[i].front() )
{
q[i].push(q[i].front());
last_num[i] = q[i].front();
q[i].pop();
last_num[i] = counter;
}
}
}
cout << "Case " << k +1<<":";
if( tag == 0 )
cout << " unwinnable\n";
else
{
for (int i=0; i<player_num; ++i )
{
cout <<' '<< last_num[i];
}
cout << endl;
}
}
}
浙公网安备 33010602011771号