规则:将一副扑克(10个)平均分成两份,每人拿一份。A先将手中第一张扑克放在桌子上,B也拿出手上第一张扑克,并放在A刚放在桌子上的牌的上面,两人交替出牌。如果某人打出的牌与桌面上的某张牌相同,即将两张相同的牌全部取走并放在自己手牌的末尾。当一方手中牌全部出完时游戏结束,对手获胜。
思路:
- A和B出牌收牌的过程符合队列的先进先出,可以使用两个队列模拟A和B手中的牌;
- 桌子上的牌符合栈的后进后出,可以使用一个栈模拟桌子上的牌;
- 设立
int book[10] 记录每个数字在桌子上是否出现过; - 游戏结束条件,某一方队列为空(head == tail);
源码:
#include<stdio.h>
typedef struct queue {
int date[1000];
int head;
int tail;
}Que;
typedef struct stack {
int date[12];
int top;
}Stk;
int main() {
Que qa, qb;
Stk s;
int book[10] = {0};
int i, k;
//初始化
qa.head = qa.tail = 0;
qb.head = qb.tail = 0;
s.top = -1;
//输入数据
for (i = 0; i < 6; i++) {
scanf("%d", &qa.date[qa.tail++]);
}
for (i = 0; i < 6; i++) {
scanf("%d", &qb.date[qb.tail++]);
}
while (qa.head < qa.tail && qb.head < qb.tail) { //双方手牌不为空 开始游戏
s.date[++s.top] = qa.date[qa.head++]; //A出牌
if (book[s.date[s.top]] == 1) { //此牌在桌子上出现过
k = s.date[s.top]; //保存数值
qa.date[qa.tail++] = s.date[s.top--]; //因为桌子上存在这张牌,将此牌入队,从桌子上出栈
while (s.date[s.top] != k) { //将两牌间的牌放入A的队列
book[s.date[s.top]] = 0; //重置book
qa.date[qa.tail++] = s.date[s.top--];
}
qa.date[qa.tail++] = s.date[s.top--]; //数值相同的牌放入A的队列
book[k] = 0; //重置book
} else { //没出现过
book[s.date[s.top]] = 1; //标记数字出现了一次
}
if (qa.head == qa.tail) {
break; //游戏结束
}
s.date[++s.top] = qb.date[qb.head++]; //B出牌
if (book[s.date[s.top]] == 1) { //此牌在桌子上出现过
k = s.date[s.top]; //保存数值
qb.date[qb.tail++] = s.date[s.top--]; //因为桌子上存在这张牌,将此牌入队,从桌子上出栈
while (s.date[s.top] != k) { //将两牌间的牌放入B的队列
book[s.date[s.top]] = 0;
qb.date[qb.tail++] = s.date[s.top--];
}
qb.date[qb.tail++] = s.date[s.top--]; //数值相同的牌放入B的队列
book[k] = 0; //重置book
} else { //没出现过
book[s.date[s.top]] = 1; //标记数字出现了一次
}
if (qb.head == qb.tail) {
break; //游戏结束
}
}
if (qa.head == qa.tail) {
printf("B胜利\n");
printf("B的手牌:");
for (i = qb.head; i < qb.tail; i++) {
printf("%d ", qb.date[i]);
}
printf("\n桌上的牌:");
for (i = 0; i <= s.top; i++) {
printf("%d ", s.date[i]);
}
printf("\n");
} else {
printf("A胜利\n");
printf("A的手牌:");
for (i = qa.head; i < qa.tail; i++) {
printf("%d ", qa.date[i]);
}
printf("\n桌上的牌:");
for (i = 0; i <= s.top; i++) {
printf("%d ", s.date[i]);
}
printf("\n");
}
return 0;
}
|