小风和小雷是一起玩到大的双胞胎兄弟,星期天,小风和小雷在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小风先拿出手中的第一张扑克牌放在桌子上,然后小雷也拿出手中的第一张扑克牌,并放在小风刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上的某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一个手中的牌全部出完时,游戏结束,对手获胜。
代码如下
#include <stdio.h>
#include <malloc.h>
struct Stack//创建一个栈
{
int top;
int base;
int *elem;
};
struct Queue//创建一个队列
{
int head;
int tail;
int *elem;
};
void initStack(Stack &stack)//初始化栈
{
stack.top=0;
stack.base=0;
stack.elem=(int *)malloc(sizeof(int)*1000);
}
void pushStack(Stack &stack,int elem)//入栈
{
stack.top++;
stack.elem[stack.top]=elem;
}
void popStack(Stack &stack)//出栈
{
stack.top--;
}
void showStack(Stack &stack)//打印栈内元素
{
while(stack.top!=stack.base)
{
printf("%d ",stack.elem[stack.top]);
stack.top--;
}
printf("\n");
}
void initQueue(Queue &queue)//初始化队列
{
queue.head=0;
queue.tail=0;
queue.elem=(int *)malloc(sizeof(int)*1000);
}
void pushQueue(Queue &queue,int elem)//入队
{
queue.elem[queue.tail]=elem;
queue.tail++;
}
void popQueue(Queue &queue)//出队列
{
queue.head++;
}
void showQueue(Queue &queue)//输出队列元素
{
while(queue.head!=queue.tail)
{
printf("%d ",queue.elem[queue.head]);
queue.head++;
}
printf("\n");
}
int main()
{
Stack table;//创建一个桌子栈
Queue xiaoFeng,xiaoLei;//创建两个队列
int elem1,elem2;
initQueue(xiaoFeng);
initQueue(xiaoLei);
initStack(table);
int book[9]={0};//使用桶排序的思想,记录是否有相同的牌出现
printf("请输入小风的牌:\n");
for(int i=0;i<6;i++)
{
scanf("%d",&elem1);
pushQueue(xiaoFeng,elem1);
}
printf("请输入小雷的牌:\n");
for(int i=0;i<6;i++)
{
scanf("%d",&elem2);
pushQueue(xiaoLei,elem2);
}
while(xiaoLei.head<xiaoLei.tail&&xiaoFeng.head<xiaoFeng.tail)//两人手内都有牌的情况
{
int t = xiaoFeng.elem[xiaoFeng.head];//把小风的第一张牌放在桌子上
if(book[t]==0)//如果桌子上没有小风的第一张牌
{
popQueue(xiaoFeng);//小风去掉第一张
pushStack(table,t);//桌子上放上小风的第一张牌
book[t]=1;//把标志位置位
}
else//如果有小风的牌
{
popQueue(xiaoFeng);//先放在桌子上
pushQueue(xiaoFeng,t);//然后把在拿走
while(table.elem[table.top]!=t)//这个循环是把t之后的牌都拿走
{
book[table.elem[table.top]]=0;
pushQueue(xiaoFeng,table.elem[table.top]);
popStack(table);
}
book[table.elem[table.top]]=0;//最后把和t相等的牌拿走
pushQueue(xiaoFeng,table.elem[table.top]);
popStack(table);
}
if(xiaoFeng.head==xiaoFeng.tail)//如果小风的牌没了,就不用比了,直接小雷胜出了
{
break;
}
t=xiaoLei.elem[xiaoLei.head];//下面的代码和上面的类似
if(book[t]==0)
{
popQueue(xiaoLei);
pushStack(table,t);
book[t]=1;
}
else
{
popQueue(xiaoLei);
pushQueue(xiaoLei,t);
while(table.elem[table.top]!=t)
{
book[table.elem[table.top]]=0;
pushQueue(xiaoLei,table.elem[table.top]);
popStack(table);
}
book[table.elem[table.top]]=0;
pushQueue(xiaoLei,table.elem[table.top]);
popStack(table);
}
}
if(xiaoLei.head==xiaoLei.tail)//下面是分情况输出
{
printf("小风win\n");
printf("哥哥还是比弟弟稍微厉害那么一点点的\n");
printf("小风当前手中的牌是 ");
showQueue(xiaoFeng);
if(table.top!=table.base)
{
printf("桌子上的牌是 ");
showStack(table);
}
else
{
printf("桌子上已经没有牌了");
}
}
else
{
printf("小雷win\n");
printf("出师不利,这局重开..\n");
printf("小雷当前手中的牌是 ");
showQueue(xiaoLei);
if(table.top!=table.base)
{
printf("桌子上的牌是 ");
showStack(table);
}
else
{
printf("桌子上已经没有牌了");
}
}
return 0;
}
运行结果:
请输入小风的牌:
3 1 3 5 6 4
请输入小雷的牌:
2 4 1 2 5 6
小风win
哥哥还是比弟弟稍微厉害那么一点点的
小风当前手中的牌是 3 4 5 3 6 4 1 6 1 2 2
桌子上的牌是 5