队列模拟 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; } } }