解析
题目内容:
题意:
- 该游戏由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"变量来标记该玩家是否已经拿出所有卡牌,能更容易进行条件的判断表示.