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