ZJNU 2353 - UNO

大模拟,但是题目好像有些地方表述不清

根据UNO在初中曾被别人虐了很久很久的经历

猜测出了原本的题意

本题中的+2虽然有颜色,但是也可以当作原UNO游戏中的+4黑牌

即在某人出了+2后,可以出不同颜色的+2更改场上的颜色

在+2环节,如果一个人除了+2,下一个人如果有+2,就可以把+2出出去,这一回合就不需要再出东西了

直到最后一个人没有任何颜色的+2牌了,那么这个人就要摸累积起来的数量的牌

#include<bits/stdc++.h>
using namespace std;
queue<int> q;
int have[5][55],haveNum[5];
int gcid(char in){
    switch(in){
        case 'B':return 1;
        case 'G':return 2;
        case 'R':return 3;
        case 'Y':return 4;
    }
}
void getcard(int who,int num){
    int i;
    for(i=0;i<num;i++){
        have[who][q.front()]++;
        q.pop();
    }
    haveNum[who]+=num;
}
int main(){
    int i,j,turn=1,nDigit,nColor,pluscard=0;
    bool could=false,sameColor=false;
    char s[5];
    memset(have,0,sizeof have);
    memset(haveNum,0,sizeof haveNum);
    for(i=0;i<88;i++){
        cin>>s;
        if(s[1]=='Y')
            q.push(gcid(s[0]));
        else
            q.push(gcid(s[0])*10+s[1]-'0');
    }
    for(i=0;i<5;i++)
        getcard(i,7);
    for(i=0;!could&&i<10;i++)
        for(j=1;j<5;j++)
            if(have[0][j*10+i]){
                have[0][j*10+i]--;
                haveNum[0]--;
                nColor=j;
                nDigit=i;
                q.push(j*10+i);
                could=true;
                break; 
            }
    for(i=1;!could&&i<5;i++)
        if(have[0][i]){
            have[0][i]--;
            haveNum[0]--;
            nColor=j;
            q.push(i);
            pluscard+=2;
            sameColor=true;
            could=true;
        }
    while(haveNum[0]&&haveNum[1]&&haveNum[2]&&haveNum[3]&&haveNum[4]){
        could=false;
        if(pluscard){
            if(have[turn][nColor]){//同色+2
                have[turn][nColor]--;
                haveNum[turn]--;
                pluscard+=2;
                q.push(nColor);
                could=true;
            }
            for(i=1;!could&&i<5;i++)//异色+2
                if(have[turn][i]){
                    have[turn][i]--;
                    haveNum[turn]--;
                    nColor=i;
                    pluscard+=2;
                    q.push(i);
                    could=true;
                }
            if(could){
                turn=(turn+1)%5;
                continue;
            }
            else{
                getcard(turn,pluscard);
                pluscard=0;
            }
        }
        for(i=0;!could&&i<10;i++)//相同颜色选数字 
            if(have[turn][nColor*10+i]){
                have[turn][nColor*10+i]--;
                haveNum[turn]--;
                nDigit=i;
                q.push(nColor*10+i);
                could=true;
                sameColor=false;
                
            }
        for(i=1;!could&&!sameColor&&i<5;i++)//相同数字选颜色
            if(have[turn][i*10+nDigit]){
                have[turn][i*10+nDigit]--;
                haveNum[turn]--;
                nColor=i;
                q.push(i*10+nDigit);
                could=true;
            }
        if(!could&&have[turn][nColor]){//同色+2
            have[turn][nColor]--;
            haveNum[turn]--;
            pluscard+=2;
            q.push(nColor);
            sameColor=true;
            could=true;
        }
        for(i=1;!could&&sameColor&&i<5;i++)//异色+2
            if(have[turn][i]){
                have[turn][i]--;
                haveNum[turn]--;
                nColor=i;
                pluscard+=2;
                q.push(i);
                could=true;
            }
        if(!could)
            getcard(turn,1);
        turn=(turn+1)%5;
    }
    getcard(turn,pluscard);
    for(i=0;i<5;i++){
        if(!haveNum[i])
            puts("Winner");
        else{
            int score=0;
            for(j=1;j<5;j++)
                if(have[i][j])
                    score+=20*have[i][j];
            for(j=10;j<50;j++)
                if(have[i][j])
                    score+=(j%10)*have[i][j];
            printf("%d\n",score);
        }
    }
    
    return 0;
}

 

posted @ 2020-01-28 21:14  StelaYuri  阅读(136)  评论(1编辑  收藏  举报