“ 小猫钓鱼”。游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。 q1先拿出手中的第一张扑克牌放在桌上,然后q2也拿出手中的第一张扑克牌, 并放在q1刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。
假如游戏开始时,q1手中有6张牌,顺序为241256,q2手中也有6张牌,顺序为313564,最终谁会获胜呢?现在你可以拿出纸牌来试一试。接下来请你写一个程序来自动判断谁将获胜。这里我们做一个约定,q1和q2手中牌的牌面只有1~9。
分析:
1.出牌看作出队,将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾 看作入队
2.桌面上的牌看作出栈和入栈
创建队列和栈的结构体
struct queue
{
int data[100];
int head;
int tail;
};
struct stack
{
int data[100];
int top;
};
3.判断自己能否赢牌,可以根据桶排序的思想。手中的牌只要0~9,可以使用book[10]来存储,初始化为0;
int book[10];
for(int i=1;i<10;i++)
book[i]=0;
4.如果桌面上增加了一张牌面为2的牌,需要将book[2]==1;表示桌面上有牌面为2 的牌。若牌面为2的牌被赢走,book[2]==0。
代码如下
#include
using namespace std;
struct queue
{
int data[100];
int head;
int tail;
};
struct stack
{
int data[100];
int top;
};
int main()
{
struct queue q1,q2;
struct stack s;
q1.head=1; q1.tail=1;
q2.head=1; q2.tail=1;
s.top=0;
int n,t,book[10];
printf("请输入每人手中有几张牌\n");
cin>>n;
for(int i=1;i<10;i++)
book[i]=0;
printf("请输入玩家Q1的牌\n");
for(int i=0;i<n;i++)
{//为玩家q1赋值(发牌)
scanf("%d",&q1.data[q1.tail]);
q1.tail++;
}
printf("请输入玩家Q2的牌\n");
for(int i=0;i<n;i++)
{//为玩家q2赋值(发牌)
scanf("%d",&q2.data[q2.tail]);
q2.tail++;
}
while(q1.head<q1.tail&&q2.head<q2.tail)//循坏的条件,两人手中都有牌
{
t=q1.data[q1.head];//玩家q1出一张牌
if(book[t]==0)//表示桌面无此牌,无法赢牌
{
q1.head++;//将队首的牌出出去;
s.data[++s.top]=t;//入栈
book[t]=1; //标记桌面先存在此牌
}
else
{//桌面有此牌,赢牌
q1.head++;// 将队首的牌出出去;
q1.data[q1.tail]=t;//再将出出去的牌收回来(入队)
q1.tail++;
while(s.data[s.top]!=t)
{//循坏把牌入队
book[s.data[s.top]]=0;//把收回的牌标记为0,表示桌面现无此牌
q1.data[q1.tail]=s.data[s.top];//入队
q1.tail++;
s.top--; //出栈
}
book[s.data[s.top]]=0;//收回桌面牌面为t的牌
q1.data[q1.tail]=s.data[s.top];
q1.tail++;
s.top--;
}
if(q1.head==q1.tail)break;
t=q2.data[q2.head]; //玩家q2出一张牌
if(book[t]==0)
{
q2.head++;
s.data[++s.top]=t;
book[t]=1;
}
else
{
q2.head++;
q2.data[q2.tail]=t;
q2.tail++;
while(s.data[s.top]!=t)
{
book[s.data[s.top]]=0;
q2.data[q2.tail]=s.data[s.top];
s.top--;
q2.tail++;
}
book[s.data[s.top]]=0;
q2.data[q2.tail]=s.data[s.top];
q2.tail++;
s.top--;
}
}
if(q2.head==q2.tail)
{
printf("Q1win\n");
printf("手中的牌 ");
for(int i=q1.head;i0)
{
printf("桌上的牌还有");
for(int i=1;i<=s.top;i++)
printf("%d",s.data[i]); //输出桌面上的牌
}
else printf("桌上无牌");
}
else
{
printf("Q2win\n");
printf("手中的牌 ");
for(int i=q2.head;i0)
{
printf("桌上的牌还有");
for(int i=1;i<=s.top;i++)
printf("%d",s.data[i]);
}
else printf("桌上无牌");
}
getchar();getchar();
return 0;
}