一、游戏规则
将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。(小哼和小哈手中牌的牌面只有1~9),加入游戏开始的时候,两人都是6张牌。
二、题目分析
- 小哼和小哈有两种操作,分别是出牌和赢牌,这恰好对应队列的两个操作,出牌就是出队,赢牌就是入队。
- 桌子就是一个栈,每打出一张牌放到桌上就相当于入栈。当有人赢牌的时候,依次将牌从桌上拿走,这就相当于出栈。
- 枚举桌上的每一张牌,如果某人打出的牌与桌子上的某张牌相同,即可将两张牌以及中间所夹的牌全部取走。
- 综上所述,我们需要两个队列、一个栈来模拟整个游戏。
代码如下:
/**题目:
将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,
并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,
即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,
游戏结束,对手获胜。(小哼和小哈手中牌的牌面只有1~9)加入游戏开始的时候,两人都是6张牌。
**/
#include<bits/stdc++.h>
using namespace std;
struct Stack{
int data[15];
int top;
};
struct Queue{
int data[100];
int head;
int tail;
};
int main(){
Stack s;
Queue q1,q2;
int book[10]; //判断该数是否已在桌上
//初始化栈
s.top=0;
//初始化队列
q1.head=0; q1.tail=0;
q2.head=0; q2.tail=0;
//初始化
for(int i=0;i<10;i++) {
book[i]=0;
}
//小哼的牌
for(int i=0;i<6;i++){
scanf("%d",&q1.data[q1.tail++]);
}
//小哈的牌
for(int i=0;i<6;i++){
scanf("%d",&q2.data[q2.tail++]);
}
while(q1.tail>q1.head&&q2.tail>q2.head) { //两个人手上的牌都不为空
printf("一轮出牌:\n");
int temp1=q1.data[q1.head++];//小哼出牌
if(book[temp1]==1) { //桌面上存在,则出栈 ,然后入队列
printf("小哼出的牌存在\n");
q1.data[q1.tail++]=temp1; //刚刚出队列的数重新进入队列
while(s.data[--s.top]!=temp1&&s.top>=0){
q1.data[q1.tail++]=s.data[s.top--];
}
q1.data[q1.tail++]=s.data[s.top--];
book[temp1]=0;
}
else{ //不存在,入栈
printf("小哼出的牌不存在\n");
book[temp1]=1;
s.data[s.top++]=temp1;
}
int temp2=q2.data[q2.head++]; //小哈出的牌
if(book[temp2]==1) { //桌面上存在,则出栈 ,然后入队列
printf("小哈出的牌存在\n");
q2.data[q2.tail++]=temp2; //刚刚出队列的数重新进入队列
while(s.data[--s.top]!=temp2&&s.top>=0){
q2.data[q2.tail++]=s.data[s.top--];
}
q2.data[q2.tail++]=s.data[s.top--];
book[temp2]=0;
}
else{ //不存在,入栈
printf("小哈出的牌不存在\n");
book[temp2]=1;
s.data[s.top++]=temp2;
}
}
if(q1.tail==q1.head){
printf("小哼win");
}
else{
printf("小哈win");
}
}