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;
}

代码解释

  1. 使用 queue 数据结构来存储正在游玩和排队的玩家队列。
  2. 使用 unordered_set 来记录正在游玩的玩家,方便快速判断是否已经在排队。
  3. 循环遍历每个事件,根据事件类型进行相应的处理。
  4. 对于 start 事件,首先判断队列是否为空,为空则输出 'Error' 并忽略。否则,将正在游玩的玩家按照顺序输出,并将其从队列和 playingSet 中移除。
  5. 对于 arrive 事件,首先判断该玩家是否已经在排队或正在游玩,如果存在则输出 'Error' 并忽略。否则,将该玩家加入排队队列,并将其加入 playingSet,最后输出 'OK'。
  6. 对于 leave 事件,首先判断该玩家是否在排队,如果不在则输出 'Error' 并忽略。否则,将该玩家从 playingSet 中移除,并输出 'OK'。

总结

本文提供了一个简单的 C++11 代码示例,用于实现一个游戏机排队系统。您可以根据实际需求进行扩展和改进,例如加入更多事件类型、限制游戏时间等。

补充说明

这里的排队和传统的排队有出入。正在游玩的人为队列的前两位,所以正在游玩视为正在排队。

C++11 实现游戏机排队系统:维护队列并处理事件

原文地址: https://www.cveoy.top/t/topic/qinc 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录