ZJNU 2353 - UNO

Posted stelayuri

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZJNU 2353 - UNO相关的知识,希望对你有一定的参考价值。

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

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

猜测出了原本的题意

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

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

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

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

接下来头脑风暴叭

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 queue<int> q;
  4 int have[5][55],haveNum[5];
  5 int gcid(char in){
  6     switch(in){
  7         case B:return 1;
  8         case G:return 2;
  9         case R:return 3;
 10         case Y:return 4;
 11     }
 12 }
 13 void getcard(int who,int num){
 14     int i;
 15     for(i=0;i<num;i++){
 16         have[who][q.front()]++;
 17         q.pop();
 18     }
 19     haveNum[who]+=num;
 20 }
 21 int main(){
 22     int i,j,turn=1,nDigit,nColor,pluscard=0;
 23     bool could=false,sameColor=false;
 24     char s[5];
 25     memset(have,0,sizeof have);
 26     memset(haveNum,0,sizeof haveNum);
 27     for(i=0;i<88;i++){
 28         cin>>s;
 29         if(s[1]==Y)
 30             q.push(gcid(s[0]));
 31         else
 32             q.push(gcid(s[0])*10+s[1]-0);
 33     }
 34     for(i=0;i<5;i++)
 35         getcard(i,7);
 36     for(i=0;!could&&i<10;i++)
 37         for(j=1;j<5;j++)
 38             if(have[0][j*10+i]){
 39                 have[0][j*10+i]--;
 40                 haveNum[0]--;
 41                 nColor=j;
 42                 nDigit=i;
 43                 q.push(j*10+i);
 44                 could=true;
 45                 break; 
 46             }
 47     for(i=1;!could&&i<5;i++)
 48         if(have[0][i]){
 49             have[0][i]--;
 50             haveNum[0]--;
 51             nColor=j;
 52             q.push(i);
 53             pluscard+=2;
 54             sameColor=true;
 55             could=true;
 56         }
 57     while(haveNum[0]&&haveNum[1]&&haveNum[2]&&haveNum[3]&&haveNum[4]){
 58         could=false;
 59         if(pluscard){
 60             if(have[turn][nColor]){//同色+2
 61                 have[turn][nColor]--;
 62                 haveNum[turn]--;
 63                 pluscard+=2;
 64                 q.push(nColor);
 65                 could=true;
 66             }
 67             for(i=1;!could&&i<5;i++)//异色+2
 68                 if(have[turn][i]){
 69                     have[turn][i]--;
 70                     haveNum[turn]--;
 71                     nColor=i;
 72                     pluscard+=2;
 73                     q.push(i);
 74                     could=true;
 75                 }
 76             if(could){
 77                 turn=(turn+1)%5;
 78                 continue;
 79             }
 80             else{
 81                 getcard(turn,pluscard);
 82                 pluscard=0;
 83             }
 84         }
 85         for(i=0;!could&&i<10;i++)//相同颜色选数字 
 86             if(have[turn][nColor*10+i]){
 87                 have[turn][nColor*10+i]--;
 88                 haveNum[turn]--;
 89                 nDigit=i;
 90                 q.push(nColor*10+i);
 91                 could=true;
 92                 sameColor=false;
 93                 
 94             }
 95         for(i=1;!could&&!sameColor&&i<5;i++)//相同数字选颜色
 96             if(have[turn][i*10+nDigit]){
 97                 have[turn][i*10+nDigit]--;
 98                 haveNum[turn]--;
 99                 nColor=i;
100                 q.push(i*10+nDigit);
101                 could=true;
102             }
103         if(!could&&have[turn][nColor]){//同色+2
104             have[turn][nColor]--;
105             haveNum[turn]--;
106             pluscard+=2;
107             q.push(nColor);
108             sameColor=true;
109             could=true;
110         }
111         for(i=1;!could&&sameColor&&i<5;i++)//异色+2
112             if(have[turn][i]){
113                 have[turn][i]--;
114                 haveNum[turn]--;
115                 nColor=i;
116                 pluscard+=2;
117                 q.push(i);
118                 could=true;
119             }
120         if(!could)
121             getcard(turn,1);
122         turn=(turn+1)%5;
123     }
124     getcard(turn,pluscard);
125     for(i=0;i<5;i++){
126         if(!haveNum[i])
127             puts("Winner");
128         else{
129             int score=0;
130             for(j=1;j<5;j++)
131                 if(have[i][j])
132                     score+=20*have[i][j];
133             for(j=10;j<50;j++)
134                 if(have[i][j])
135                     score+=(j%10)*have[i][j];
136             printf("%d
",score);
137         }
138     }
139     
140     return 0;
141 }

 

以上是关于ZJNU 2353 - UNO的主要内容,如果未能解决你的问题,请参考以下文章

luogu P2353 背单词

51nod 2353STL排队问题

洛谷 P2353 背单词

[COGS 2353 & 2356] 有标号的DAG计数 容斥原理

第2353期Nginx 中运行 JavaScript

51nod.2353排队问题(STL)