使用c++并使用链表完成模拟算法来完成下列问题,问题描述 现在有n个小朋友(编号依次为 )要排队。 一开始他们各自为一队,接下来,老师会发布m(<1000)条命令,每条命令给出两个同学的编号i,j,表示让j同学排到i同学后面。原先在j后面的同学则保持原来的队伍不变。 输出完成老师的m条指令以后,还剩下多少列队伍,并按照队首同学编号从小到大的顺序输出每个队伍,输出一个队伍时,按照从前到后的顺序输出队伍中每个同学的编号。 输入描述 从标准输入读入数据 第一行,两个整数n,m(l<n,m<1000)。 接下来m行,每行两个整数i,j (1≤i、j≤n,i≠j),表示让j同学排到i同学后面 输出描述 输出若干行。 第一行,一个整数k,表示执行完操作后的队伍数量。 接下来k行,按照队首同学编号从小到大的顺序输出每个队伍。每行输出一个队伍,输出一个队伍时,按照从前到后的顺序输出队伍中每个同学的编号。 样例输入 5 5 3 5 4 2 5 4 5 4 2 4 样例输出 3 1 2 4 3 5
时间: 2024-04-15 17:30:17 浏览: 47
用c++ 实现的一个队列模拟
5星 · 资源好评率100%
以下是使用C++和链表实现的模拟算法来解决这个问题的代码示例:
```cpp
#include <iostream>
#include <list>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
// 创建链表存储队伍
vector<list<int>> queues;
for (int i = 0; i < n; i++) {
list<int> queue;
queue.push_back(i+1);
queues.push_back(queue);
}
// 按照命令进行排队
for (int i = 0; i < m; i++) {
int x, y;
cin >> x >> y;
// 找到x同学所在的队伍
list<int>::iterator it = find(queues[x-1].begin(), queues[x-1].end(), x);
// 插入y同学到x同学的后面
queues[x-1].insert(++it, y);
}
// 统计剩下的队伍数量和每个队伍中的同学编号
vector<list<int>> remainingQueues;
for (const list<int>& queue : queues) {
if (!queue.empty()) {
remainingQueues.push_back(queue);
}
}
// 输出结果
cout << remainingQueues.size() << endl;
for (const list<int>& queue : remainingQueues) {
for (int student : queue) {
cout << student << " ";
}
cout << endl;
}
return 0;
}
```
希望对你有帮助!
阅读全文