规则:将一副扑克(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; }