题目在这里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;
}