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

  

posted @ 2013-01-24 19:04  PDJ_  阅读(265)  评论(0编辑  收藏  举报