C++作业之模拟打牌:小喵钓鱼

今天总结了一下之前学习的东西,发现在《算法设计与优化》这门课有一个问题如下,觉得不错,想与大家分享:

游戏规则:一副牌均分为两份,每人一份。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)级。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值