小哼和小哈玩小猫钓鱼。
小猫钓鱼规则:将一份扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。
首先根据规则,很容易将手牌与队列联系在一起(尾插首删),将出牌的牌堆模拟为栈。
两人不管有没有赢牌,都会换对手出牌。而出牌的结果有两种,一种为赢牌,一种为未赢。所以找到合适的判断条件,一个while循环就可以知道结果。
(此例代码判断的是一人六张手牌)
#include <stdlib.h>
#include <stdio.h>
//模拟每个人手中的牌组
struct queue
{
int data[1000];
int head;
int tail;
};
//模拟桌上的打出的牌堆
struct Stack
{
int top;
int data[20];
};
int main()
{
//小哼先出牌
struct queue heng,ha;
struct Stack stack;
//队列栈初始化,队列从1开始
heng.head=1;
heng.tail=1;
ha.head=1;
ha.tail=1;
stack.top=0; int i; //循环变量i,接下来进行为队列赋值,也就是模拟手牌
for(i=0; i<6; i++)
{
scanf("%d",&heng.data[heng.tail]);
heng.tail++;
}
for(i=0; i<6; i++)
{
scanf("%d",&ha.data[ha.tail]);
ha.tail++;
}
//判断游戏是否结束,当有一人的head和tail相等时,可判定游戏结束
while(heng.head!=heng.tail && ha.head!=ha.tail)
{
int t=heng.data[heng.head]; //模拟小哼打出手牌,将手牌值赋给t
int flag=0; //flag标志位,判断打出的牌堆中是否有相同的牌
for(i=0; i<stack.top; i++) //将牌堆中的每一张牌进行遍历,如过有相同则将flag置为1
{
if(t==stack.data[i])
{
flag=1;
break;
}
}
//无相同的牌
if(flag==0)
{
heng.head++; //将第一张牌出队
stack.data[stack.top]=t; //将t入栈
stack.top++; //栈顶++
}
//有相同的牌
if(flag==1)
{
heng.head++; //不管怎样,head必然要先++
stack.data[stack.top]=t; //先将打出的牌入栈,方便统一管理
stack.top++;
while(stack.top>=i) //在判断flag时就已经得与t相同的牌的位置,为i。将top与i之间的牌入队(包括top和i)
{
heng.data[heng.tail]=stack.data[--stack.top];
heng.tail++;
}
}
//小哈的两种情况与小哼的处理类似
t=ha.data[ha.head];
flag=0;
for(i=0; i<stack.top; i++)
{
if(t==stack.data[i])
{
flag=1;
break;
}
}
if(flag==0)
{
ha.head++;
stack.data[stack.top]=t;
stack.top++;
}
if(flag==1)
{
ha.head++;
stack.data[stack.top]=t;
stack.top++;
while(stack.top>=i)
{
ha.data[ha.tail]=stack.data[--stack.top];
ha.tail++;
}
}
}
//判断谁赢
if(heng.head==heng.tail)
{
printf("小哈获胜!\n");
}
else
printf("小哼获胜!");
return 0;
}