游戏规则 将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放桌上,然后小哈也拿出来手中的第一张扑克牌,并放在小哼刚打出来的扑克牌上边,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌面上某张牌的牌面相同,即可将两张相同的牌极其中间所加的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。
’
假如游戏开始小哼和小哈手中各有6 张牌,小哼:2 4 1 2 5 6,小哈:3 1 3 5 6 4 我们来分析一下这个游戏有哪几种操作。小哼有两种操作,分别是出牌和赢牌。这恰好对应队列的两个操作,出牌就是出队,赢牌就是入队。小哈也一样。而桌子就是一个栈,每放一张牌在桌子上就相当于入栈。当有人赢牌时,依次从桌子上拿走牌,就相当于出栈。
‘
赢牌规则
如果某人打出的牌与桌上的某张牌相同,即可将两张相同的牌极其中间所加的牌全部取走。那么如何确定桌上已经有哪些牌了呢?最简单的方法就是枚举桌上的每一张牌。
我们需要两个队列一个栈来模拟整个游戏
首先我们先创建一个结构体实现队列
struct queue
{
int data[1000];
int head;
int tail;
};
上述代码中head用来存储队头,tail用来存储队尾。数组data用来存储队列中的元素。
再创建一个结构体来实现栈
struct stack
{
int data a[10];
int top;
};
其中top用来存储栈顶,数组data用来存储栈中元素
接下来我们需要定义两个队列变量q1和q2。q1用来模拟小哼手中的牌,q2用来模拟小哈手中的牌。定义一个栈变量s用来模拟桌上的牌。
struct queue q1,q2;
struct stack s;
接下来初始化一下队列和栈
//初始化队列q1和q2为空,此时两人的手中还没有牌
q1.head=1;q1.tail=1;
q2.head=1;q2.tail=1;
//初始化栈为空,最开始桌上没有牌
s.top=0;
接下来需要读入小哈和小哼手中的牌,分两次读入,每次读入6个数,分别插入q1和q2中。
完整代码
#include<stdio.h>
struct queue
{
int data[1000];
int head;
int tail;
};
struct stack
{
int data[10];
int top;
};
int main()
{
struct queue q1,q2;
struct stack s;
int book[10];
int i,t;
//初始化队列
q1.head=1;q1.tail=1;
q2.head=1;q2.tail=1;
//初始化栈
for(i=1;i<=9;i++)
{
book[i]=0;//记录桌上有几张牌
}
//小哼手中的6张牌
for(i=1;i<=6;i++)
{
scanf("%d",&q1.data[q1.tail]);
q1.tail++;
}
//小哈手中的6张牌
for(i=1;i<=6;i++)
{
scanf("%d",&q2.data[q2.tail]);
q2.tail++;
}
while(q1.head<q1.tail && q2.head<q2.tail)//当队列不为空时执行循环
{
t=q1.data[q1.head];//小哼出一张牌
//判断当前小哼打出的牌是否能赢牌
if(book[t]==0)//桌子上没有牌面为t的牌
{
q1.head++;//打出的牌出队
s.top++;
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;//取消标记
q1.data[q1.tail]=s.data[s.top];
q1.tail++;
s.top--;
}
//收回桌子上牌面为t的牌
book[s.data[s.top]]=0;
q1.data[q1.tail]=s.data[s.top];
q1.tail++;
s.top--;
}
if(q1.head==q1.tail) break;//如果小哼手中的牌打完,游戏结束
t=q2.data[q2.head];//小哈出一张牌
//判断小哈是否赢牌
if(book[t]==0)//没有赢牌 桶排序
{
q2.head++;
s.top++;
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];
q2.tail++;
s.top--;
}
book[s.data[s.top]]=0;
q2.data[q2.tail]=s.data[s.top];
q2.tail++;
s.top--;
}
}
if(q2.head==q2.tail)//小哼赢
{
printf("小哼赢\n");
printf("小哼当前手中的牌是:\n");
for(i=q1.head;i<=q1.tail-1;i++)
{
printf("%5d",q1.data[i]);
}
if(s.top>0)
{
printf("桌上的牌是:\n");
for(i=0;i<=s.top;i++)
{
printf("%5d",s.data[i]);
}
}
else
{
printf("桌上没有牌了");
}
}
else
{
printf("小哈赢了\n");
printf("小哈当前手中的牌是:\n");
for(i=q2.head;i<=q2.tail-1;i++)
{
printf("%5d",q2.data[i]);
}
if(s.top>0)
{
printf("桌上的牌是:\n");
for(i=0;i<=s.top;i++)
{
printf("%5d",s.data[i]);
}
}
else
{
printf("桌上没有牌了");
}
}
return 0;
}