解析
题目内容:
题意:
- 该游戏由2-6人组成
- 每个玩家有1-9张排序好的卡片(升序)
- 每张卡牌的权值在10-99之间(包括边界)
- 没有重复权值的卡
- 游戏目标:每一位玩家拿出自己的卡牌构造成一个卡牌堆,按照升序的方式排列
- 题目目标:输出玩家放置卡牌时的编号顺序(A,B,C....)
输入描述:
1.第一行输出p(2~6),即玩家数量
2.接下来的p行输入,第一个元素c为玩家所持有卡牌的数量,紧随其后的为c个不同卡牌的权值(已排序)
输出描述:
输出玩家放置卡牌时的编号顺序
分析:
限制条件:
- 卡牌的数量是固定的,每个人拿出一张后自己会少一张,且用完后不再进行比较
- 仍持有卡牌的玩家们,需要拿出自身所持有的权值最小卡牌并进行比较,最终选择出最小权值的卡牌并放入卡牌堆,即相当于对该部分玩家的最小卡牌权值的一次遍历
- 每一位玩家如果需要放置自己的卡牌,必定为手中权值最小的卡牌
由以上三点可以得出一种思路:
- 在初始化玩家存储的卡牌信息时,可以同时声明一个整形变量并指向玩家最小权值卡牌的位置(可为指针类型),在将这张牌放入牌堆后自动指向下一个最小权值的卡牌,直到所有卡牌打出后停止该玩家的比较.
- 对所有玩家所持有最小权值卡牌的遍历,需要根据第一点的指向性变量来进行元素的选择并比较,并记录下持有最小权值卡牌玩家的编号.
- 在第一点的拿出卡牌的同时,可以输出该玩家的编号(提示:利用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"变量来标记该玩家是否已经拿出所有卡牌,能更容易进行条件的判断表示.

京公网安备 11010502036488号