Game
Game
Sample Input
3 4 1 3 1 2 3 2 1
Sample Output
Caspar
分析:
大致题意:
就是我们小时候玩的“接火车”,每人轮流拿一张牌出来,形成新的序列,如果这个序列里有和你的牌号一样的牌,你就可以将那张牌到你的牌之间的所有牌取出,放在你自己的序列里。例如:新序列为1,2,3,5,8,4,而如果此时你拿出的是一张3的话,你就可以将3,5,8,4,3取出,放入你自己的序列里,那么新序列就是1,2了。如果轮到一方,并且这方自己的序列没有牌了,那他(她)就算输了
思路:
其实这道题只需模拟一下整个过程就行了。由于新序列始终是从尾部取,所以用一个数组就行了,并记下尾部的位置;而由于博弈的双方要轮流的从头取牌,还会在尾部加牌,那用一个环形队列也就行了,环形队列节约并利用空间
代码如下:
# include<stdio.h> # include<malloc.h> #define MaxSize 400//由题意,所有的元素个数永远不会超过400 typedef int ElemType; typedef struct node { ElemType data[MaxSize]; int front,rear; }SqQueue; void InitQueue(SqQueue *&q) { q=(SqQueue *)malloc(sizeof(SqQueue)); q->front=q->rear=0; } int EmptyQueue(SqQueue *q) { return (q->front==q->rear); } void InsertQueue(SqQueue *&q,ElemType e) { q->rear=(q->rear+1)%MaxSize; q->data[q->rear]=e; } int main() { SqQueue *boy,*girl; int dp[MaxSize+2]; int numb,numg; int en,i,j,now; while((scanf("%d %d",&numb,&numg))!=EOF) { InitQueue(boy); InitQueue(girl); for(i=1;i<=numb;i++) scanf("%d",&boy->data[i]); boy->rear=numb; for(i=1;i<=numg;i++) scanf("%d",&girl->data[i]); girl->rear=numg; now=1;//记录轮到哪方出牌 en=0; while(1) { if(now==1) { if(!EmptyQueue(boy)) { boy->front=(boy->front+1)%MaxSize; dp[en++]=boy->data[boy->front]; now=2; } else { printf("Rapsac\n");//输出胜者 break; } } else if(now==2) { if(!EmptyQueue(girl)) { girl->front=(girl->front+1)%MaxSize; dp[en++]=girl->data[girl->front]; now=1; } else { printf("Caspar\n"); break; } } for(i=en-2;i>=0;i--) { if(dp[i]==dp[en-1]) { if(now==2) { for(j=i;j<=en-1;j++) { InsertQueue(boy,dp[j]); } } else if(now==1) { for(j=i;j<=en-1;j++) { InsertQueue(girl,dp[j]); } } en=i;//取出牌后,尾标记也要更新 break; } } } } return 0; }
浙公网安备 33010602011771号