解析

题目内容:

题意:

  1. 该游戏由2-6人组成
  2. 每个玩家有1-9张排序好的卡片(升序)
  3. 每张卡牌的权值在10-99之间(包括边界)
  4. 没有重复权值的卡
  5. 游戏目标:每一位玩家拿出自己的卡牌构造成一个卡牌堆,按照升序的方式排列
  6. 题目目标:输出玩家放置卡牌时的编号顺序(A,B,C....)

输入描述:

1.第一行输出p(2~6),即玩家数量
2.接下来的p行输入,第一个元素c为玩家所持有卡牌的数量,紧随其后的为c个不同卡牌的权值(已排序)

输出描述:

输出玩家放置卡牌时的编号顺序

分析:

限制条件:

  1. 卡牌的数量是固定的,每个人拿出一张后自己会少一张,且用完后不再进行比较
  2. 仍持有卡牌的玩家们,需要拿出自身所持有的权值最小卡牌并进行比较,最终选择出最小权值的卡牌并放入卡牌堆,即相当于对该部分玩家的最小卡牌权值的一次遍历
  3. 每一位玩家如果需要放置自己的卡牌,必定为手中权值最小的卡牌

由以上三点可以得出一种思路:

  1. 在初始化玩家存储的卡牌信息时,可以同时声明一个整形变量并指向玩家最小权值卡牌的位置(可为指针类型),在将这张牌放入牌堆后自动指向下一个最小权值的卡牌,直到所有卡牌打出后停止该玩家的比较.
  2. 对所有玩家所持有最小权值卡牌的遍历,需要根据第一点的指向性变量来进行元素的选择并比较,并记录下持有最小权值卡牌玩家的编号.
  3. 在第一点的拿出卡牌的同时,可以输出该玩家的编号(提示:利用ASCII码较为便捷,'A'的ASCII码值为65)

代码:

#include <bits/stdc++.h>
#define MAXSIZE 9

using namespace std;

struct info
{
    unsigned cards[MAXSIZE];
    unsigned cardsPointer = 0;
    unsigned cardsNum = 0;
    bool finished = false;
};

int main()
{
    unsigned playerCount = 0;
    info stu[6];
    cin >> playerCount;
    unsigned cardsTotal = 0;
    for (int i = 0; i < playerCount; i++)
    {
        int cardsNum = 0;
        cin >> cardsNum;
        stu[i].cardsNum = cardsNum;
        cardsTotal += cardsNum;
        for (int k = 0; k < cardsNum; k++)
        {
            cin >> stu[i].cards[k];
        }
    }

    int playerID = 0;

    for (int l = 0; l < cardsTotal; l++)
    {
        unsigned min = 100;
        for (int j = 0; j < playerCount; j++)
        {
            if ((min > stu[j].cards[stu[j].cardsPointer]) && (!stu[j].finished))
            {
                min = stu[j].cards[stu[j].cardsPointer];
                playerID = j;
            }
        }
        stu[playerID].cardsPointer++;
        if (stu[playerID].cardsPointer == stu[playerID].cardsNum)
        {
            stu[playerID].finished = true;
        }

        // cout << playerID << endl;
        printf("%c",65 + playerID);
    }

    return 0;
}

以上代码中,采用了bool值的"finish"变量来标记该玩家是否已经拿出所有卡牌,能更容易进行条件的判断表示.