sicily 1003之模拟题

题目在这里1003

这是一道模拟题。题目意思是:

1、很多玩家排排坐

2、第一个玩家拿到一堆以某种顺序弄好的52张卡牌堆(每种花色13张,4中花色)

3、从第一个玩家开始,每个玩家都从1-13报数,每报一个数,查看一下自己的牌堆中最上面的一张牌,如果跟报的数一样,那么把这张牌传给下一个玩家,放在下一个玩家牌堆最后,最后一个玩家直接将牌弃掉。如果不一样,那么把这张牌放到自己的牌堆最后

4、报的数跟牌堆最上面的牌的数字一样,称作一次match;不一样,称作不match。无论是match还是不match,这个人的报数已经完成了,需要轮到下一个玩家报数了。同时,下次再轮到这个玩家的时候,从之前停下的数字开始报

比如:A报了1,发现手上的牌是2,那么把这张牌放到自己牌堆的最后,然后轮到下一个玩家B开始报数;轮完一圈过后,又轮到A,此时A从2开始报数

5、手上没牌的玩家不能报数,需要等到上一个玩家把match的牌传到他手上,即等到手上有牌,才能开始报数。道理跟4一样,如果B玩家手上有一张4,而轮到他报数的时候,他报的就是4,那么手上就没牌了。下一轮,如果B的上家没有传牌给B,那么B不能报数,直接跳过。等到若干次后,B的上家传给B牌了,此时B从5开始报数

好了,大概的题意就是这样,最后输出的是每个玩家最后丢掉的牌,这里的丢掉包括把牌传给下一个玩家。如果没有办法把这堆牌丢完,那么返回unwinnable。

题目意思就是这样,我判断是否丢完的方法比较暴力,就是让它循环很多次,我设置的是10000,如果达到这个次数还没有完成,那么就是unwinnable,否则在这之前完成了,就会直接返回。

另外,再说一句:模拟题重要的是理解题意,题意理解了,整道题还是比较简单的。用自己最先想到的方法去解,基本上都能写出来,也不会出现恶心的超时错误。

代码如下,仅供参考:

#include<iostream>
#include<queue>
#include<string.h>
using namespace std;

queue<int> deck[10];
int people[10], players, ans[10];

bool play_games()
{
	int times = 10000, tmp;
	while (times--)
	{
		for (int i = 0; i < players; i++)
		{
			if (deck[i].empty())
				continue;
			tmp = (people[i] + 1) % 13 == 0 ? 13 : (people[i] + 1) % 13;
			if (deck[i].front() == tmp)
			{
				if (i != players - 1)
					deck[i + 1].push(deck[i].front());
				if (i == 0)
				{
					if (deck[i].size() == 1)
						ans[i] = deck[i].front();
				}
				else
				{
					if (deck[i - 1].empty() && deck[i].size() == 1)
						ans[i] = deck[i].front();
				}
				deck[i].pop();
			}
			else
			{
				deck[i].push(deck[i].front());
				deck[i].pop();
			}
			people[i] = tmp;
		}

		int empty_num = 0;
		for (int i = 0; i < players; i++)
		{
			if (deck[i].empty())
				empty_num++;
		}
		if (empty_num == players)
			return true;

	}
	return false;
}

int main()
{
	int amount, card;
	cin >> amount;
	for (int i = 1; i <= amount; i++)
	{
		memset(people, 0, sizeof(people));
		memset(ans, 0, sizeof(ans));

		cin >> players;
		for (int j = 0; j < 52; j++)
		{
			cin >> card;
			deck[0].push(card);
		}

		cout << "Case " << i << ":";
		
		if (play_games())
		{
			for (int j = 0; j < players; j++)
				cout << " " << ans[j];
			cout << endl;
		}
		else
		{
			cout << " unwinnable" << endl;
		}
		
		for (int j = 0; j < 10; j++)
		{
			while (!deck[j].empty())
			{
				deck[j].pop();
			}
		}
	}
	//system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值