#include <iostream>
#include <queue>
using namespace std;
int main() {
int n;
while(cin >> n) {
for (int i = 0; i < n; ++i)
{
int numOfPlayer;
cin >> numOfPlayer;
queue<int> deck[11];
int temp;
for (int j = 0; j < 52; ++j)
{
cin >> temp;
deck[0].push(temp);
}
int counter[11] = {0}; //counter for ecery player
int lastCard[11] = {0}; //last cast card
int countTimes[11] = {0}; //count times for each player.
//If countTimes reach 13, then the game is unwinable
bool winFlag = false;
int leftCard = 52; //leaving cards
int playerIndex = 0;
while(!winFlag) {
if(deck[playerIndex].empty()) {
playerIndex = (playerIndex+1) % numOfPlayer; //next player
continue;
}
counter[playerIndex]++;
countTimes[playerIndex]++;
lastCard[playerIndex] = deck[playerIndex].front(); //get the top card
deck[playerIndex].pop();
if(counter[playerIndex] == lastCard[playerIndex]) { //math
deck[playerIndex+1].push(lastCard[playerIndex]); //give math card to next player
countTimes[playerIndex] = 0;
if(playerIndex+1 == numOfPlayer) { //if the dummy player
leftCard--;
if(leftCard == 0) { //all card have been casted
winFlag = true;
break;
}
}
} else {
deck[playerIndex].push(lastCard[playerIndex]); //put no-math card in bottom
}
if(countTimes[playerIndex] > deck[playerIndex].size()*13) {
winFlag = false;
break;
}
if(counter[playerIndex] == 13)
counter[playerIndex] = 0;
playerIndex = (playerIndex+1)%numOfPlayer; //no matter math or not, each player can match only once each time
}
cout << "Case " << i+1 << ":";
if(winFlag) {
for (int j = 0; j < numOfPlayer; ++j)
{
cout << ' ' << lastCard[j];
}
cout << endl;
} else
cout << " unwinnable" << endl;
}
}
return 0;
}
[sicily] 1003. hit or miss
最新推荐文章于 2015-09-18 13:44:04 发布