这道题做起来比较像在做阅读理解......表示英语不好的伤不起。
读了M次,没怎么懂题意,最后在参考其他人的代码才明白过来。
这里有一个讲解题意讲的比较清楚的,我就不累赘了。
http://blog.youkuaiyun.com/chenhq1991/article/details/7795757
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
int k = 1;
while (t--)
{
int i;
int n;
//多出一个队列,算是偷懒,用来收集被最后一个人丢弃的卡片
queue<int> q[11];
int cd;
scanf("%d",&n);
for (i = 0; i < 52; i++)
{
scanf("%d",&cd);
q[0].push(cd);
}
int players[10];
for (i = 0; i < n; i++)
players[i] = 1;
bool finish = false;
int cnt = 0;
/*13*52毕竟总有个结束的时候嘛,其实是情况最差的一个循环,
就是第一个人拿着52张牌不断的走一个循环,后面的人跟着做空循环,一个循环都过来了,之后再循环也就没意义了。
*/
while (cnt < 13 * 52 && !finish) {
finish = true;
for (i = 0; i < n; i++) {
if (!q[i].empty()) {
finish =false;
if (players[i] != q[i].front())
q[i].push(q[i].front());
else {
//最后一个人的时候,其实是扔给11号,算是扔掉了的。
q[i+1].push(q[i].front());
cnt = -1;
}
q[i].pop();
players[i] = players[i] % 13 + 1;
}
cnt++;
}
}
cout << "Case " << k++ << ":";
if (finish) {
for (i = 0; i < n; ++i)
//因为在队列空了之后,还做了一次加法,所以在这里调整过来。
if (players[i] == 1)
cout << ' ' << 13;
else
cout << ' ' << players[i]-1;
}
else
cout << " unwinnable";
cout << endl;
}
return 0;
}