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的主要内容,如果未能解决你的问题,请参考以下文章