今天总结了一下之前学习的东西,发现在《算法设计与优化》这门课有一个问题如下,觉得不错,想与大家分享:
游戏规则:一副牌均分为两份,每人一份。A 出一张,B 出一张当某人出的牌与桌子上某张牌相同,就将两张相同的牌及中间所夹的牌取走,并依次放到自己牌的末尾。当有人将手中牌出完时,游戏结束,对手获胜。
假设:牌面只有1~9,初始每人有6 张牌
请编写程序来自动判断谁将获胜。并分析所采用算法的复杂度。
#include<iostream>
#include<stack>
using namespace std;
int main()
{
int order = 0;
int temp;
int total = 6;
stack<int> P1;
stack<int> P2;
stack<int> Desk;
stack<int> Temp;
stack<int> Result;
void God_Show(stack<int> &P1, stack<int> &P2, stack<int> &Desk);
//分别输入两人的牌
for (int i = 0; i < total; i++)
{
cin >> temp;
P1.push(temp);
}
for (int j = 0; j < total; j++)
{
cin >> temp;
P2.push(temp);
}
//开始游戏
//谁的牌小谁先出
//P1.top() ? P2.top() : order = 1, order = 2;
//A先出牌
int num;
int First;
while (!P1.empty() && !P2.empty())
{
Desk.push(P1.top());
P1.pop();//P1出牌
if (Desk.size() == 1)
First = Desk.top();//存放第一个数作为哨兵
if (Desk.top() == First && Desk.size() > 1) //如果栈长度大于1,并且首尾相等
{
//这些牌都归A
Desk.swap(Temp);//Desk 空 Temp正常存放
while (!P1.empty())
{
Result.push(P1.top());
P1.pop();
}
while (!Result.empty())
{
Temp.push(Result.top());
Result.pop();
}
Temp.swap(P1);//堆栈完毕后,再跟P1进行交换,完毕后,Temp 空
}
God_Show(P1, P2, Desk);//打印所有人的手牌
Desk.push(P2.top());
P2.pop();
if (Desk.size() == 1)
First = Desk.top();//存放第一个数作为哨兵
if (Desk.top() == First && Desk.size() > 1)//如果栈长度大于1,并且首尾相等
{
//这些牌都归B
Desk.swap(Temp);//Desk 空 Temp正常存放
while (!P2.empty())
{
Result.push(P2.top());
P2.pop();
}
while (!Result.empty())
{
Temp.push(Result.top());
Result.pop();
}
Temp.swap(P2);//堆栈完毕后,再跟P2进行交换,完毕后,Temp 空
}
God_Show(P1, P2, Desk);//打印所有人的手牌
}
if (P1.empty() && !P2.empty())
cout << "P2 win";
if (P2.empty() && !P1.empty())
cout << "P1 win";
if (P1.empty() && P2.empty())
cout << "平局!";
}
void God_Show(stack<int> &P1, stack<int> &P2, stack<int> &Desk)
{
stack<int> Read;
cout << "P1的手牌:";
while (!P1.empty())
{
Read.push(P1.top());
P1.pop();
}
while (!Read.empty())
{
cout << Read.top() << ", ";
P1.push(Read.top());
Read.pop();
}
cout << endl;
cout << "P2的手牌:";
while (!P2.empty())
{
Read.push(P2.top());
P2.pop();
}
while (!Read.empty())
{
cout << Read.top() << ", ";
P2.push(Read.top());
Read.pop();
}
cout << endl;
cout << "桌子上的牌:";
while (!Desk.empty())
{
Read.push(Desk.top());
Desk.pop();
}
while (!Read.empty())
{
cout << Read.top() << ", ";
Desk.push(Read.top());
Read.pop();
}
cout << endl << endl;
}
分析:结果一共有三种情况:P1赢、P2赢、平局(双方都没牌了)
代码中有两个while(){while()}的嵌套循环,时间复杂度为O(n)级。