大模拟,但是题目好像有些地方表述不清
根据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\n",score);
137 }
138 }
139
140 return 0;
141 }
来源:https://www.cnblogs.com/stelayuri/p/12238953.html