问题:
小猫钓鱼纸牌游戏:
两个人一起玩纸牌游戏,将一副扑克牌平均分成两份,其中一个人先将自己手中的第一张扑克牌放在桌上,然后另一个人也拿出手中的第一张扑克牌,并放在刚刚第一张扑克牌的上面,就像这样,两个人交替出牌,出牌时。如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放在自己手中牌的末尾,当任意一个人的手中牌全部出完时,游戏结束,对手获胜。(这里假设开始时每个人手上有六张牌)
分析:
这道题我们会用到队列和栈的相关知识,那么什么是队列和栈呢?
队列:
队列是一种特殊的线性结构,它只允许在队列的首部(head)和尾部(tail)进行插入操作,这个就叫做“入队”。举个例子:假设我们在生活中购买东西都需要你排队,这个就是一个队列,在这个队列中,新来的人总是站在队伍的最后面,来的越早的人越靠前,也就是“先进先出”原则。
就像下面这个代码:
#include<stdio.h>
main()
{
int q[102]={0,6,3,1,7,5,8,9,2,4},head,tail;
head=1;
tail=10;
while(head<tail)
{
printf("%d",q[head]);
head++;
q[tail]=q[head];
tail++;
head++;
}
}
这个代码所体现的就是,一个数组将第一个数删除,紧接着将第二个数放在这个数组的末尾,再将第三个数删除,将第四个数放在这个数组的末尾,依次类推;
栈:
栈与队列不同,栈是一种:“后进先出”的数据结构,例如在装子弹的时候最后装入的那枚子弹却是第一个打出去的子弹。与队列类比一下。
下面我们继续看这个问题:
首先根据上文所讲,我们需要创建一个结构体用来实现队列:
struct queue
{
int data[100];
int head;
int tail;
};
上面的head用来存储队头,那么tail用来存储队尾,data用来存储元素。
下面需要再创建一个结构体来实现栈:
struct stack
{
int data[100];
int top;
};
top:用来存储栈项,data仍是用来存储元素的。
接下来我们要使用刚刚定义的队列结构体和栈结构体:设置q1,q2为两个人手中的牌,再定义一个栈变量s来模拟桌上的牌。
struct queue q1,q2;
struct stack s;
接下来就是c语言的常用:初始化(因为两个人最开始手上没有牌,桌子上也没有牌)
q1.head=1;
q1.tail=1;
q2.head=1;
q2.tail=1;
s.top=0;
接下来利用循环和scanf函数循环输入两个人手中的牌
for(i=1;i<=6;i++)
{
scanf("%d",&q1.data[q1.tail]);
q1.tail++;
}
for(i=1;i<=6;i++)
{
scanf("%d",&q2.data[q2.tail]);
q2.tail++;
}
上面全部是准备工作,接下来第一个人先出牌:
t=q1.data[q1.head];
接下来既然出牌了,我们就需要进行判断,利用枚举将桌子上的每一张牌都与t进行对比,利用for循环即可:
for(i=1;i<=s.top;i++)
{
if(t==s.data[i])
{
flag=1;
break;
}
}
如果flag=0,就说明打出的牌没有与桌上牌相同的,也就意味这不能赢得桌上的牌,而flag=1就可以收回桌子上的牌直至取到的与打出的牌相同为止。
if(flag==0)
{
q1.head++;
s.top++;
s.data[s.top]=t;
}
if(flag=1)
{
q1.head++;
q1.data[q1.tail]=t;
q1.tail++;
while(s.data[s.top]!=t)
{
q1.data[q1.tail]=s.data[s.top];
q1.tail++;
s.top--;
}
}
以上就是对出牌的模拟,那么整个游戏结束的标志是:两个人中只要其中有一个人的牌用完了游戏就结束了,因此我们需要用一个while循环(当两个人的手中都还有牌时执行循环):
while(q1.head<q1.tail && q2.head<q2.tail)
接下来出牌决胜负阶段结束了,进行总结阶段:
if(q2.head==q2.tail)
{
printf("q1胜利\n");
printf("q1当前手中的牌是:");
for(i=q1.head;i<=q1.tail-1;i++)
{
printf(" %d",q1.data[i]);
}
if(s.top>0)
{
printf("\n桌上的牌是:");
for(i=1;i<s.top;i++)
{
printf(" %d",s.data[i]);
}
else
{
printf("\n桌上已经没有牌了");
}
}
}
这道题的具体思想就是这样,主要运用了队列和栈相关的知识。