星期天小A和小B约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏——“小猫钓鱼”。游戏规则是这样的:将一副扑克平均分成两份,每人拿一份。小A先拿出手中的第一张扑克牌放在桌上,然后小B叶拿出手中的第一张扑克牌,并放在小A扑克牌的上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌面上某张牌面相同,可将两张相同的牌及其中所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。
假如游戏开始的时候,小A手中有6张牌,顺序为 2 4 1 2 5 6,小B手中也有6张牌,顺序为 3 1 3 5 6 4,并且小A先出牌。最终谁会获胜呢?
程序如下:
static void Main(string[] args)
{
/*
* 小猫钓鱼游戏
* 输入: 数组A 2,4,1,2,5,6
* 数组B 3,1,3,5,6,4
* 输出:A或者B
* */
int[] A = new int[] { 2, 4, 1, 2, 5, 6, 0, 0, 0, 0, 0, 0, 0 };
int[] B = new int[] { 3, 1, 3, 5, 6, 4, 0, 0, 0, 0, 0, 0, 0 };
int aHead = 0, aTail = 6;
int bHead = 0, bTail = 6;
int[] Stack = new int[A.Length*2];
int sTop = 0;
while(aHead != aTail && bHead != bTail) //如果小A和小B手里都有牌
{
//A
Stack[sTop++] = A[aHead]; //小A出牌
A[aHead] = 0; //将小A出掉的牌置零,用于调试可不加
aHead++;
if(aHead==A.Length)
{
aHead = 0;
}
for(int i=0; i< sTop-1; i++) //检查桌面上面有没有和小A出的牌面相同
{
if(Stack[i] == Stack[sTop - 1])
{
for(int j=sTop-1; j>=i;j--) //如果有,依次取牌插回小A手里
{
A[aTail] = Stack[j];
Stack[j] = 0;
sTop--;
aTail++;
if (aTail == A.Length)
{
aTail = 0;
}
}
}
}
//B
Stack[sTop++] = B[bHead];
B[bHead] = 0;
bHead++;
if (bHead == B.Length)
{
bHead = 0;
}
for (int i = 0; i < sTop - 1; i++)
{
if (Stack[i] == Stack[sTop - 1])
{
for (int j = sTop - 1; j >= i; j--)
{
B[bTail] = Stack[j];
Stack[j] = 0;
sTop--;
bTail++;
if (bTail == B.Length)
{
bTail = 0;
}
}
}
}
}
if(aHead == aTail)
{
Console.WriteLine("B win!");
}
else
{
Console.WriteLine("A win!");
}
}