题意
题目连接:http://soj.sysu.edu.cn/1003
有纸牌游戏 Hit or Miss,游戏流程为:有一套叠好的纸牌(52 张,4 组,值为 1 - 13,花色在本游戏不重要)。
1. 玩家从 1 开始计数;
2. 如果当前计数与最顶端的纸牌数值相同,则扔掉最顶端纸牌,否则将最顶端的纸牌放入这叠纸牌最底部;
3. 计数加一,当计数超过 13 时,回到 1 重新计数。重复第二步;
该游戏也支持多名玩家,最开始只给第一名玩家一叠纸牌(52张)。
1. 玩家从上次自己计数停止处开始计数,最开始为 1;
2. 当玩家接受到纸牌时塞入自己维护的纸牌的最底部。
3. 如果当前计数与自己维护的纸牌最顶端的纸牌数值不同,将最顶端的纸牌放入这叠纸牌最底部,并回到第一步。否则,如果该玩家是最后一名玩家,则扔掉该纸牌,如果不是最后一名玩家,则将该纸牌传递给下一位玩家。数值相同的情况下,游戏都从下一位玩家开始;
4. 当所有牌都被扔了时,游戏胜利。
根据输入的玩家数量以及一套乱序纸牌,判断游戏是否能够胜利。如果能够游戏胜利,则给出结束时,每位玩家或传递或扔掉的最后一张纸牌的数值。否则输出 unwinnable。
题解
题目没有涉及复杂的算法,只要模拟这个游戏就好了……为每个玩家维护一个纸牌队列,然后循环就行。至于游戏是否能够胜利这点,我们只能以循环的次数决定了,当循环次数过大时,游戏结束。(我在提交时设置的次数为 5000,能够 AC)。
代码
代码这块也很朴实。不过我没有用到标准库提供的队列,自己粗暴地实现了一个循环队列来模拟每个玩家维护的纸牌队列~
#include <stdio.h>
#include <string.h>
#define CARD_MAX 52
#define