用c++写停车场有M个入口,P个出口,停车场共有N个车位,其中每5个车位为一个小型立体车库,先来后到原则进行入场,入场后开始进行计费。若停车场满了之后,门口的车一次排队,出来一辆车之后,放行一辆车再入场。 要求:1)每个入口使用队列结构模拟排队场景,排序车辆需要记录排队时间,根据时间先后进场放行。 2)每个小型立体车库只用散列表进行模拟入库及出库。 3)计费原则:15分钟以下免费,超过15分钟按0.5元/15分钟。小型车夜间停车1元/小时。
时间: 2024-03-26 09:38:47 浏览: 51
好的,这是一个具体的停车场模拟问题,我会尽力回答你的问题。
首先,我们可以定义一个类来表示停车场的信息,包括停车位数量、入口数量、出口数量等等。然后,我们可以使用队列来模拟每个入口的排队情况。当每个入口有车辆到来时,我们将该车辆的信息加入到队列的末尾,等待进入停车场。
对于停车场中的小型立体车库,我们可以使用散列表来模拟。具体来说,我们可以将每5个车位看作一个小型立体车库,用散列表来存储该车库中的车辆信息。当车辆进入停车场时,我们需要先找到一个空闲的小型立体车库,然后将该车辆的信息加入到对应的散列表中。
当车辆离开停车场时,我们需要根据车牌号找到该车辆的信息,并计算停车费用。如果车辆停放时间不足15分钟,则不需要支付停车费用。如果车辆停放时间超过15分钟,则需要按0.5元/15分钟的标准进行计费。如果该车辆是小型车且停放时间在夜间(例如,从晚上9点到早上6点),则需要支付1元/小时的夜间停车费用。
当停车场满了之后,我们需要按照先来后到的原则进行排队,等待有车辆离开停车场后再放行一辆车进入停车场。
以下是一个简单的停车场模拟程序的示例代码,供你参考:
```cpp
#include <iostream>
#include <queue>
#include <unordered_map>
#include <vector>
#include <ctime>
using namespace std;
// 车辆信息结构体
struct CarInfo {
string plateNum; // 车牌号
time_t enterTime; // 进入时间
time_t exitTime; // 离开时间
bool isNight; // 是否是夜间停车
int parkingLotId; // 停车位编号
double parkingFee; // 停车费用
};
class ParkingLot {
private:
int numParkingLots; // 停车位数量
int numEntrances; // 入口数量
int numExits; // 出口数量
queue<CarInfo> *entranceQueues; // 入口排队队列数组
unordered_map<int, vector<CarInfo>> parkingLots; // 停车位散列表
public:
ParkingLot(int n, int m, int p) : numParkingLots(n), numEntrances(m), numExits(p) {
entranceQueues = new queue<CarInfo>[numEntrances];
}
~ParkingLot() {
delete[] entranceQueues;
}
// 车辆进入停车场
void enterParkingLot(CarInfo car) {
// 找到一个空闲的停车位
bool isFound = false;
for (int i = 0; i < numParkingLots / 5; i++) {
if (parkingLots[i].size() < 5) {
car.parkingLotId = i;
parkingLots[i].push_back(car);
isFound = true;
break;
}
}
if (!isFound) {
cout << "停车场已满,车辆 " << car.plateNum << " 进入排队队列" << endl;
entranceQueues[rand() % numEntrances].push(car);
} else {
cout << "车辆 " << car.plateNum << " 进入停车位 " << car.parkingLotId << endl;
}
}
// 车辆离开停车场
void exitParkingLot(string plateNum) {
bool isFound = false;
for (int i = 0; i < numParkingLots / 5; i++) {
for (int j = 0; j < parkingLots[i].size(); j++) {
if (parkingLots[i][j].plateNum == plateNum) {
time_t now = time(NULL);
double diff = difftime(now, parkingLots[i][j].enterTime);
if (diff < 900) { // 不足15分钟免费
parkingLots[i].erase(parkingLots[i].begin() + j);
cout << "车辆 " << plateNum << " 离开停车位 " << i << endl;
cout << "停车时间不足15分钟,免费" << endl;
} else {
double fee = 0.5 * (diff / 900.0);
if (parkingLots[i][j].isNight) { // 夜间停车费用
fee += (now - parkingLots[i][j].enterTime) / 3600.0;
}
parkingLots[i].erase(parkingLots[i].begin() + j);
cout << "车辆 " << plateNum << " 离开停车位 " << i << endl;
cout << "停车时间:" << diff / 60 << "分钟,停车费用:" << fee << "元" << endl;
}
isFound = true;
break;
}
}
if (isFound) break;
}
if (!isFound) {
cout << "未找到车牌号为 " << plateNum << " 的车辆" << endl;
}
// 有空位,放行排队中的车辆
for (int i = 0; i < numEntrances; i++) {
if (!entranceQueues[i].empty()) {
enterParkingLot(entranceQueues[i].front());
entranceQueues[i].pop();
break;
}
}
}
};
int main() {
srand(time(NULL));
ParkingLot parkingLot(20, 2, 2);
// 模拟车辆进入停车场
for (int i = 0; i < 25; i++) {
CarInfo car;
car.plateNum = "车牌" + to_string(i);
car.enterTime = time(NULL);
car.isNight = (car.enterTime % 86400 >= 21 * 3600 || car.enterTime % 86400 <= 6 * 3600);
parkingLot.enterParkingLot(car);
}
// 模拟车辆离开停车场
for (int i = 0; i < 25; i++) {
parkingLot.exitParkingLot("车牌" + to_string(i));
}
return 0;
}
```
以上就是一个简单的停车场模拟程序示例,希望能够帮助你解决问题。如果你有任何疑问或者需要进一步的帮助,请随时向我提问。
阅读全文