#P2589. Snap

Snap

中文题面:

描述

Snap是一款双人卡牌游戏。牌堆包含若干种类型的牌。初始时,每位玩家持有牌堆的一半,顺序随机,面朝下叠成一摞,并按从顶到底的顺序依次打出,将每张牌正面朝上放入另一摞。当面朝下的牌堆用尽时,将正面朝上的牌堆翻转作为新的面朝下牌堆,继续游戏。

两名玩家同时且同步地打出各自的牌。即,双方会在同一时刻各放置一张正面朝上的牌。若同时出现的两张牌类型相同,则双方均需喊出“Snap!”,率先喊出的玩家将拿走对方当前所有正面朝上的牌,并将其置于自己牌堆的顶部。

游戏持续进行,直至某位玩家获得所有牌。该玩家即为胜者。

你的任务是模拟一场Snap游戏,判断游戏是否会在10001000轮内结束;若结束,则确定胜者。

输入:

每种牌由单个字母或数字表示。输入的第一行为Jane的初始牌堆(从顶到底的顺序),第二行为John的初始牌堆。Jane和John初始持有的牌数相同,且不超过5050张。

输出:

当需要喊“Snap!”时,通过以下方式判定谁先喊出:

C/C++: rand()/99rand()/99%2

Pascal: randomrandom divdiv 9999 modmod 22

若结果为00,则Jane先喊;否则John先喊。 每当Jane先喊时,输出“Snap! for Jane: ”后接Jane当前正面朝上的牌堆(从顶到底顺序);John先喊时同理。若游戏结束,输出“Jane wins.”或“John wins.”。若双方各打出10001000张牌后仍未分出胜负,则输出“Keeps going and going ...”

输入数据 1

ABCDA
CBADC

输出数据 1

Snap! for Jane: BCBA
Snap! for Jane: DADCBCBA
Snap! for John: CBAC
Snap! for John: ADADCBAC
John wins.

来源

2000年1月29日加拿大滑铁卢大学编程比赛