题目:
星期天小A和小B约在一起玩桌游,他们在玩一个非常古怪的扑克游戏—“小猫游戏”。游戏的规则是这样的:将一副扑克牌平均分成两份,每个人拿一份。小A先拿出手中的第一张扑克牌放在桌子上,然后将小B也拿出手中的第一张扑克牌,并放在小A刚打出的扑克牌的上面,就像这样俩个仁交替出牌。出牌时,如果某人打出牌与桌面上的牌面相同,即可将俩张相同的牌及其中间所夹得牌全部取走,并依次放到自己手中得最后,当任意一个人手中的牌全部出完时,游戏结束,对手获胜。
假如游戏开始时,小A手中有6张牌,顺序为2 4 1 2 5 6,小B手中也有6张牌,顺序为3 1 3 5 6 4,最终谁会获胜呢?
要求
接下来请你写一个自动判断谁将获胜的程序,这里我们做一个规定,小A 和小B 手中的牌面只有1~9。
题目分析
小A有2种操作,分别是出牌和赢牌。这相当于队列的2个操作,出牌就是出队,赢牌就是入队。小B的操作和小A是一样的。桌子就像一个栈,没打出一个牌就相当于入栈,有人赢牌的时候将牌拿走相当于出栈。那么如何知道桌子上面已经有哪些牌呢?最简单的方法就是枚举桌子上面的每一张牌。
struct queue{ int data[1000]; #data存储队列中的元素 int head; int tail; }; #再创一个结构体来实现栈 struct stack{ int data[10]; #data用来存储栈中的元素 int top;#top存储栈顶 }; #定义2个队列q1和q2,q1表示小A手中的牌,q2表示小B手中的牌。定义一个栈变量s来模拟桌子上面的牌 struct queue q1,q2; struct stack s;
#初始化队列q1和q2为空,此时2人手中都还没有牌 q1.head=1; q1.tail=1; q2.head=1; q2.tail=1; #初始化栈S为空,最开始的时候桌上也没有牌 s.top=0;
#先读入6张牌,放入小A手上 for (i=1;i<6;i++) { scanf("%d",&q1.data[q1.tail]); #读入一个数进入队尾 q1.tail++; #队尾往后挪一位 } //再读入6张牌,放到小B手中 for (i=1;i<6;i++) { scanf("%d",&q2.data[q2.tail]); q2.tail++; }
下面就是需要将桌子上面的每一张牌进行枚举看是否与2人的牌一样,进行对比,下面就直接上全部的代码啦~~~
#include
struct queue
{ int data [1000]; int head; int tail;
};
struct stack
{ int data[10]; int top;
};
int main()
{ struct queue q1,q2; struct stack s; int book[10]; int i,t; //初始化队列 q1.head=1;q1.tail=1; q2.head=1;q2.tail=1; //初始化栈 s.top=0; //初始化用来标记的数组,用来标记哪些牌已经在桌上 for(i=1;i<=9;i++) book[i]=0; //依次向队列插入6个数 //小A手上的牌 for(i=1;i<=6;i++) { scanf("%d",&q1.data[q1.tail]); q1.tail++; } //小B手上的6张牌 for(i=1;i<=6;i++) { scanf("%d",&q2.data[q2.tail]); q2.tail++; } while(q1.head
可以输入以下数据进行验证:
2 4 1 2 5 6
3 1 3 5 6 4
运行结果是:
小BWIN
小B当前手中的牌是 1 6 5 2 3 4 1
桌上的牌是 3 4 5 6 2
大家快去试试吧~~,看看有没有更方便的方法可以解决这个问题,欢迎来交流呀!!!
标签: