[sicily] 1003. hit or miss

来源:互联网 发布:金属材料冲击实验数据 编辑:程序博客网 时间:2024/06/02 13:22
#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;}

0 0