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; }