#include <iostream> #include <list> #include <string> using namespace std; // 定义一个结构体表示旅客 struct Passenger { int id; string name; }; // 约瑟夫双向生死者游戏函数 void josephusGame(int p, int m, int n, int q) { // 创建旅客列表并初始化 list<Passenger> passengers; for (int i = 1; i <= p; i++) { Passenger passenger; passenger.id = i; passenger.name = "同学" + to_string(i); passengers.push_back(passenger); } // 开始游戏 auto current = passengers.begin(); while (passengers.size() > q) { // 正向计数m个旅客并移除 for (int i = 1; i < m; i++) { current++; if (current == passengers.end()) { current = passengers.begin(); } } cout << "离开的旅客学号:" << current->id << " 姓名:" << current->name << endl; current = passengers.erase(current); // 反向计数n个旅客并移除 for (int i = 1; i < n; i++) { if (current == passengers.begin()) { current = passengers.end(); } current--; } cout << "离开的旅客学号:" << current->id << " 姓名:" << current->name << endl; current = passengers.erase(current); } // 输出剩余旅客信息 cout << "剩余旅客的学号和姓名:" << endl; for (const auto& passenger : passengers) { cout << "学号:" << passenger.id << " 姓名:" << passenger.name << endl; } } int main() { int p, m, n, q; cout << "请输入旅客人数p:"; cin >> p; cout << "请输入正向计数m:"; cin >> m; cout << "请输入反向计数n:"; cin >> n; cout << "请输入剩余旅客数量q:"; cin >> q; josephusGame(p, m, n, q); return 0; }
时间: 2024-04-27 15:19:52 浏览: 16
这是一个使用 C++ 实现的约瑟夫双向生死者游戏的程序。程序中定义了一个结构体表示旅客,使用双向链表来存储旅客,并通过迭代器来访问链表中的元素。程序中的 josephusGame 函数实现了游戏的逻辑,包括正向计数和反向计数两种方式,最后输出剩余旅客的信息。在主函数中,用户需要输入旅客人数、正向计数、反向计数和剩余旅客数量等参数。程序中的注释也很详细,可以帮助理解代码的实现。
相关问题
以下代码用的什么链表,#include <iostream> #include <list> #include <string> using namespace std; // 定义一个结构体表示旅客 struct Passenger { int id; string name; }; // 约瑟夫双向生死者游戏函数 void josephusGame(int p, int m, int n, int q) { // 创建旅客列表并初始化 list<Passenger> passengers; for (int i = 1; i <= p; i++) { Passenger passenger; passenger.id = i; passenger.name = "同学" + to_string(i); passengers.push_back(passenger); } // 开始游戏 auto current = passengers.begin(); while (passengers.size() > q) { // 正向计数m个旅客并移除 for (int i = 1; i < m; i++) { current++; if (current == passengers.end()) { current = passengers.begin(); } } cout << "离开的旅客学号:" << current->id << " 姓名:" << current->name << endl; current = passengers.erase(current); // 反向计数n个旅客并移除 for (int i = 1; i < n; i++) { if (current == passengers.begin()) { current = passengers.end(); } current--; } cout << "离开的旅客学号:" << current->id << " 姓名:" << current->name << endl; current = passengers.erase(current); } // 输出剩余旅客信息 cout << "剩余旅客的学号和姓名:" << endl; for (const auto& passenger : passengers) { cout << "学号:" << passenger.id << " 姓名:" << passenger.name << endl; } } int main() { int p, m, n, q; cout << "请输入旅客人数p:"; cin >> p; cout << "请输入正向计数m:"; cin >> m; cout << "请输入反向计数n:"; cin >> n; cout << "请输入剩余旅客数量q:"; cin >> q; josephusGame(p, m, n, q); return 0; }
该代码使用了 STL 中的双向链表(即 list)来存储旅客信息。在主函数中,根据用户输入的旅客人数 p,创建了一个长度为 p 的双向链表,并为每个节点设置了旅客的学号和姓名信息。在约瑟夫双向生死者游戏函数中,使用了该链表的迭代器(即 auto current)来遍历链表节点,并且在游戏过程中不断地删除节点,直到链表中剩余的节点数等于给定的 q。最后,输出剩余旅客的学号和姓名信息。
用stl的三种容器写一个航空系统
假设我们需要实现一个航空系统,其中需要记录飞机航班信息以及乘客信息。为此,我们可以使用STL中的三种容器:vector、map和set。
1. 使用vector容器存储航班信息
vector容器是一种动态数组,我们可以使用它来存储航班信息。每个航班都可以用一个结构体来表示,包含航班号、出发地、目的地、出发时间等信息。
```c++
struct Flight {
string flightNumber; //航班号
string departure; //出发地
string destination; //目的地
string departureTime; //出发时间
};
```
我们可以将所有的航班信息存储在一个vector容器中:
```c++
vector<Flight> flights;
```
2. 使用map容器存储乘客信息
map容器是一种关联容器,它可以将一个键映射到一个值。在我们的航空系统中,我们可以使用map容器来存储乘客信息。每个乘客可以用一个结构体来表示,包含姓名、性别、年龄、所订购的航班号等信息。
```c++
struct Passenger {
string name; //姓名
string gender; //性别
int age; //年龄
string flightNumber; //所订购的航班号
};
```
我们可以将所有的乘客信息存储在一个map容器中,以航班号为键,以乘客信息的vector为值:
```c++
map<string, vector<Passenger>> passengers;
```
这样,我们就可以根据航班号来查找该航班的所有乘客。
3. 使用set容器存储航班号
set容器是一种关联容器,它可以存储一组唯一的元素,并按照一定的排序规则进行排列。在我们的航空系统中,我们可以使用set容器来存储所有的航班号。
```c++
set<string> flightNumbers;
```
这样,我们就可以快速地查找所有的航班号,并按照字典序进行排序。
综上所述,我们可以使用vector、map和set三种容器来实现一个简单的航空系统。完整的代码如下所示:
```c++
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
//航班信息结构体
struct Flight {
string flightNumber; //航班号
string departure; //出发地
string destination; //目的地
string departureTime; //出发时间
};
//乘客信息结构体
struct Passenger {
string name; //姓名
string gender; //性别
int age; //年龄
string flightNumber; //所订购的航班号
};
int main() {
//所有航班信息
vector<Flight> flights = {
{"CA1234", "北京", "上海", "2022-01-01 08:00"},
{"MU5678", "上海", "广州", "2022-01-01 10:00"},
{"CZ9012", "广州", "深圳", "2022-01-01 12:00"},
{"HU3456", "上海", "北京", "2022-01-01 14:00"}
};
//所有乘客信息
map<string, vector<Passenger>> passengers = {
{"CA1234", {{"张三", "男", 30, "CA1234"}, {"李四", "女", 25, "CA1234"}}},
{"MU5678", {{"王五", "男", 40, "MU5678"}, {"赵六", "女", 35, "MU5678"}, {"钱七", "男", 45, "MU5678"}}},
{"CZ9012", {{"周八", "女", 50, "CZ9012"}, {"吴九", "男", 55, "CZ9012"}}},
{"HU3456", {{"郑十", "女", 60, "HU3456"}}}
};
//所有航班号
set<string> flightNumbers;
for (const auto& flight : flights) {
flightNumbers.insert(flight.flightNumber);
}
//输出所有航班号
cout << "所有航班号:" << endl;
for (const auto& flightNumber : flightNumbers) {
cout << flightNumber << endl;
}
//查询某一航班的所有乘客
string flightNumber = "MU5678";
cout << "航班" << flightNumber << "的所有乘客:" << endl;
if (passengers.find(flightNumber) != passengers.end()) {
const auto& passengersOfFlight = passengers[flightNumber];
for (const auto& passenger : passengersOfFlight) {
cout << passenger.name << " " << passenger.gender << " " << passenger.age << endl;
}
}
return 0;
}
```