zoukankan      html  css  js  c++  java
  • ZJNU 2353

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

    根据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
    ",score);
            }
        }
        
        return 0;
    }
  • 相关阅读:
    详解go语言的array和slice 【一】
    node.js 事件循环
    搭建Docker私有仓库--自签名方式
    详解JavaScript闭包
    [个人翻译]Redis 集群教程(下)
    转:CMake 使用方法
    转: Ogre实现无缝地图要改的地方 记下来 用的时候可以看
    转:ogre的编译及安装
    转:Ogre TerrainGroup地形赏析
    转:如何编译delta3d
  • 原文地址:https://www.cnblogs.com/stelayuri/p/12238953.html
Copyright © 2011-2022 走看看