本题用到了栈和队列,题目来自于《啊哈!算法》游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张扑克牌,并放在小哼刚打出的扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。
对于打出纸牌我们可以认为此操作是出队,打出的牌放入桌上为入栈,收回牌放入自己手中为入队操作,收回桌上的牌为出栈操作。
#include<stdio.h>
struct queue{
int head;
int tail;
int data[1000];
};
struct stack{
int data[10];
int top;
};
int main()
{
int n,t,i,book[10];
struct queue q1,q2;//q1为a,q2为b
struct stack s;
s.top = 0;
//每人牌数
scanf("%d",&n);
//小a的牌
q1.head = 1;
q1.tail = 1;
for(i = 1;i <= n;i++)
{
scanf("%d",&q1.data[q1.tail]);
q1.tail++;
}
//小b的牌
q2.head = 1;
q2.tail = 1;
for(i = 1;i <= n;i++)
{
scanf("%d",&q2.data[q2.tail]);
q2.tail++;
}
//标记哪些牌在桌上
for(i =1 ;i <= 9;i++)
book[i] = 0;
//循环条件 (手中有牌)
while(q1.head < q1.tail && q2.head < q2.tail)
{
//小a出牌
t = q1.data[q1.head];
//当桌上没有相对应牌时
if(book[t] == 0)
{
s.top++;
s.data[s.top] = t;
q1.head++;
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--;
}
//如果小a手中牌打完即为结束
if(q1.head == q1.tail)
break;
//小b出牌
t = q2.data[q2.head];
if(book[t] == 0)
{
s.top++;
s.data[s.top] = t;
q2.head++;
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("小a win\n");
printf("手中的牌为\n");
for(i = q1.head;i < q1.tail;i++)
printf("%d ",q1.data[i]);
if(s.top > 0)
{
printf("\n桌上的牌是\n");
for(i = 1;i <= s.top;i++)
printf("%d ",s.data[i]);
}
else
printf("\nNULL\n");
}
else
{
printf("小b win\n");
printf("手中的牌为\n");
for(i = q2.head;i < q2.tail;i++)
printf("%d ",q2.data[i]);
if(s.top > 0)
{
printf("\n桌上的牌是\n");
for(i = 1;i <= s.top;i++)
printf("%d ",s.data[i]);
}
else
printf("\nNULL\n");
}
return 0;
}