题目见这里
典型的模拟题,注意对于一名玩家前面的牌堆来说,仅最上面一张牌的内容有意义; 然后就是注意在“Ring” succeed后,所有玩家的playedCards清零。
代码如下:
#include <stdio.h>
#include <string.h>
#define N 10
#define SCARD 10000000
#define KIND 4
typedef struct{
int cards; //玩家拥有的牌数
int playedCards; //玩家面前的牌数(不区分种类)
//top card
int kind; //标记animal or fruit
int attri[KIND];
}Player;
void Init(Player *player, int n){
int i,j;
for(i=0;i<n;i++){
player[i].cards = SCARD;
player[i].playedCards = 0;
}
}
int IsRingSucceed(Player *player, int n){
int fruit[KIND]={0},animal[KIND-1]={0};
int i,j;
for(i=0;i<n;i++){
if(player[i].playedCards){ //要做是否出过牌的判断
if(player[i].kind==KIND){ //fruit
for(j=0;j<KIND;j++) fruit[j] += player[i].attri[j];
}
else{ //animal
for(j=0;j<KIND-1;j++) animal[j] += player[i].attri[j];
}
}
}
//1.某种水果的数量正好为5
for(j=0;j<KIND;j++)
if(fruit[j]==5) return 1;
//2.出现猴子,至少有一个水果,且没有出现柠檬
//3.出现大象,至少有一个水果,且没有出现草莓
//4.出现猪,且至少有一个水果
if((animal[0] && !fruit[3]) || (animal[1] && !fruit[1]) || animal[2]){
for(j=0;j<KIND;j++)
if(fruit[j]) return 1;
}
return 0;
}
int Judge(char *opt, int turnPlayer, Player *player, int n){
int i;
if(!strcmp(opt,"Fruit")){
player[turnPlayer].cards --;
player[turnPlayer].playedCards ++;
player[turnPlayer].kind = KIND;
for(i=0;i<KIND;i++)
player[turnPlayer].attri[i] = 0;
int fruits,fruitAttri;
scanf("%d",&fruits);
while(fruits--){
scanf("%d",&fruitAttri);
player[turnPlayer].attri[fruitAttri] ++;
}
turnPlayer = (turnPlayer+1)%n;
}
else if(!strcmp(opt,"Animal")){
player[turnPlayer].cards --;
player[turnPlayer].playedCards ++;
player[turnPlayer].kind = KIND-1;
for(i=0;i<KIND-1;i++)
player[turnPlayer].attri[i] = 0;
int animalAttri;
scanf("%d",&animalAttri);
player[turnPlayer].attri[animalAttri] = 1;
turnPlayer = (turnPlayer+1)%n;
}
else{ //Ring
int ringer,i;
scanf("%d",&ringer);
if(IsRingSucceed(player,n)){
for(i=0;i<n;i++){
player[ringer].cards += player[i].playedCards;
player[i].playedCards = 0; //清0
}
}
else{
player[ringer].cards -= n;
for(i=0;i<n;i++) player[i].cards ++;
}
turnPlayer = ringer; //ringer始终是下一位出牌者
}
return turnPlayer;
}
int main(){
// freopen("Data.txt","r",stdin);
Player player[N];
char opt[7];
int n,k,i,turnPlayer;
scanf("%d",&n);
Init(player,n);
scanf("%d",&k);
getchar();
turnPlayer = 0;
while(k--){
scanf("%s",opt);
turnPlayer = Judge(opt,turnPlayer,player,n);
getchar();
}
for(i=0;i<n;i++) printf("%d\n",player[i].cards);
return 0;
}