问题描述:
小哼和小哈在玩一个比较奇怪的扑克游戏——小猫钓鱼。游戏规则:将一副扑克牌平均分成两份,没人拿一分。小哼先拿出手中第一张扑克牌放在桌上,然后小哈也拿出手中第一张扑克牌,并放在小哼刚才打出的扑克牌的上面,两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,可将两张相同的牌及其中间所夹的牌全部拿走,并依次放到自己手中牌的末尾。当任意一人手中当牌出完时,游戏结束,对方获胜。
分析:
1、这个游戏一共有两种操作:出牌和赢牌。
出牌即出队,赢牌即入队。
2、桌面相当于一个栈,出牌即入栈,赢牌即出栈。
3、通过枚举了解桌面有哪些牌。
思路:
1、定义两个队列q1、q2表示小哼、小哈手中的牌。
2、定义一个栈s表示桌面的牌
3、定义数组book记录桌面上已经出现的牌面
4、游戏开始时q1的队首出队,判断当前时是出牌还是赢牌
4.1如果是出牌,则入栈
4.2如果是赢牌,则q1的队首到队尾,再将赢得的牌依次入队
5、q2 的队首出队,操作同4
6、第4、5步重复进行直至任意人手中没有牌
7、输出赢的人手中的牌,输出此时桌面上的牌
代码:
(此部分代码为书上提供)
#include <stdio.h>
struct queue{
int data[1000];
int head;
int hail;
};
struct stack{
int data[10];
int top;
};
int main(int argc, const char * argv[]) {
struct queue q1,q2;
struct stack s;
int book[10]={0}; //用来标记哪些牌已经在桌子上
int i,t;
//初始化队列
q1.head=1;
q1.hail= 1;
q2.head=1;
q2.hail=1;
//初始化栈
s.top=0;
//依次向队列输入6个数
for(i=1;i<=6;i++)
{
scanf("%d",&q1.data[q1.hail]);
q1.hail++;
}
for(i=1;i<=6;i++)
{
scanf("%d",&q2.data[q2.hail]);
q2.hail++;
}
while(q1.head<q1.hail&&q2.head<q2.hail)
{
t=q1.data[q1.head]; //q1打出第一张牌
//判断q1当前打出的牌是否能赢牌
if(book[t]==0)// 表面桌上没有牌面为t的牌
{ //q1此轮不能赢牌
q1.head++;//q1打出一张牌,打出的那张牌出队
s.top++;
s.data[s.top]=t;//q1打出的牌入栈
book[t]=1;//标记已打出的牌t
}
else
{//q1此轮可以赢牌
q1.head++;//q1打出第一张牌
q1.data[q1.hail]=t;//q1打出的牌放到队尾
q1.hail++;
while(s.data[s.top]!=t)//将赢得的牌依次入队
{
q1.data[q1.hail]=s.data[s.top];
q1.hail++;
s.top--;
book[s.data[s.top]]=0;//将从桌面入队的牌取消标记
}
}
t=q2.data[q2.head];//q2出牌
if(book[t]==0) //q2此轮不能赢牌
{
q2.head++;
s.top++;
s.data[s.top]=q2.data[q2.head];
book[t]=1;
}
else
{ //q2此轮能赢牌
q2.data[q2.hail]=q2.head;
q2.head++;
q2.hail++;
while(s.data[s.top]!=t)
{
q2.data[q2.hail]=s.data[s.top];
q2.hail++;
book[s.data[s.top]]=0;
s.top--;
}
}
}
if(q2.head==q2.hail)
{
printf("q1 win!\n");
printf("q1当前手中的牌是:\n");
for(i=q1.head;i<q1.hail;i++)
{
printf("%d ",q1.data[i]);
}
if(s.top>0)//
{
printf("\n桌上的牌是:\n");
for(i=1;i<=s.top;i++)
{
printf("%d ",s.data[i]);
}
}
else
printf("\n桌上已经没有牌!\n");
}
else
if(q1.head==q1.hail)
{
printf("q2 win!\n");
printf("q2当前手中的牌是:\n");
for(i=q2.head;i<q2.hail;i++)
{
printf("%d ",q2.data[i]);
}
if(s.top>0)//
{
printf("\n桌上的牌是:\n");
for(i=1;i<=s.top;i++)
{
printf("%d ",s.data[i]);
}
}
else
printf("\n桌上已经没有牌!\n");
}
getchar();
getchar();
return 0;
}