C++11 实现游戏机排队系统:维护队列并处理事件
C++11 实现游戏机排队系统:维护队列并处理事件
这篇文章提供了一个 C++11 代码示例,用于实现一个游戏机排队系统。该系统可以处理玩家到达、离开和游戏开始等事件,并根据规则维护玩家队列,输出相应的响应。
题目描述
机厅里有一台游戏机,每次可供最多两人同时游玩。但是来玩的人显然不止两个!这个时候他们就需要排队了,而你需要写一个程序维护这个队列,并在他人游玩结束后通知接下来上场的人。在整个过程中,有以下几种事件可能发生:
- start: 一局游戏开始。若这不是第一局游戏,则上一局的参与者按照原本的顺序回到队尾。此时你应该按在队列中的顺序输出这一局上场的人的名字(正常来讲是队列前两位或者唯一一个人),若有两个则以空格分割。若这一局无人上场,则输出 'Error' 并忽略这条事件。
- arrive x: x 到达机厅并且将自己加入队尾,此时 x 不应该在排队,否则输出 'Error' 并忽略这条事件。若该事件成功执行则输出 'OK'。
- leave x: x 离开机厅并离开队列。此时 x 应该在排队但不应该在游玩,否则输出 'Error' 并忽略这条事件。若该事件成功执行则输出 'OK'。
你需要维护队列信息,并输出上述事件中要求的输出。
输入格式
第一行一个整数 n,表示事件条数。
接下来 n 行,每行表示一条事件。
输出格式
按照题目要求输出 n 行,表示程序对事件的响应。
输入输出样例
输入 #1
14
start
arrive A
start
arrive B
arrive C
arrive D
start
leave C
leave D
start
arrive A
arrive D
leave E
start
输出 #1
Error
OK
A
OK
OK
OK
B C
Error
OK
A B
Error
OK
Error
C D
C++11 代码实现
#include <iostream>
#include <queue>
#include <unordered_set>
using namespace std;
int main() {
int n;
cin >> n;
queue<string> playingQueue; // 正在游玩的队列
queue<string> waitingQueue; // 排队的队列
unordered_set<string> playingSet; // 记录正在游玩的人,用于判断是否在排队
for (int i = 0; i < n; i++) {
string event;
cin >> event;
if (event == "start") {
if (playingQueue.empty()) {
cout << "Error" << endl;
} else {
while (!playingQueue.empty()) {
cout << playingQueue.front() << " ";
playingSet.erase(playingQueue.front());
playingQueue.pop();
}
cout << endl;
}
} else if (event == "arrive") {
string name;
cin >> name;
if (playingSet.count(name) == 1 || playingQueue.size() >= 2) {
cout << "Error" << endl;
} else {
waitingQueue.push(name);
playingSet.insert(name);
cout << "OK" << endl;
}
} else if (event == "leave") {
string name;
cin >> name;
if (playingSet.count(name) == 0) {
cout << "Error" << endl;
} else {
playingSet.erase(name);
cout << "OK" << endl;
}
}
}
return 0;
}
代码解释
- 使用
queue数据结构来存储正在游玩和排队的玩家队列。 - 使用
unordered_set来记录正在游玩的玩家,方便快速判断是否已经在排队。 - 循环遍历每个事件,根据事件类型进行相应的处理。
- 对于
start事件,首先判断队列是否为空,为空则输出 'Error' 并忽略。否则,将正在游玩的玩家按照顺序输出,并将其从队列和playingSet中移除。 - 对于
arrive事件,首先判断该玩家是否已经在排队或正在游玩,如果存在则输出 'Error' 并忽略。否则,将该玩家加入排队队列,并将其加入playingSet,最后输出 'OK'。 - 对于
leave事件,首先判断该玩家是否在排队,如果不在则输出 'Error' 并忽略。否则,将该玩家从playingSet中移除,并输出 'OK'。
总结
本文提供了一个简单的 C++11 代码示例,用于实现一个游戏机排队系统。您可以根据实际需求进行扩展和改进,例如加入更多事件类型、限制游戏时间等。
补充说明
这里的排队和传统的排队有出入。正在游玩的人为队列的前两位,所以正在游玩视为正在排队。
原文地址: https://www.cveoy.top/t/topic/qinc 著作权归作者所有。请勿转载和采集!