7-13 停车场管理

7-13 停车场管理

分数 10
作者 张泳
单位 浙大城市学院

设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的先后次序依次从停车场最里面向大门口处停放 (即最先到达的第一辆车停放在停车场的最里面) 。如果停车场已放满n辆车,则以后到达的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车可以进入停车场。停车场内如有某辆车要开走,则在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费,停留在便道上的车不收停车费。编写程序对该停车场进行管理。

输入格式:

先输入一个整数n(n<=10),再输入若干组数据,每组数据包括三个数据项:汽车到达或离开的信息(A表示到达、D表示离开、E表示结束)、汽车号码、汽车到达或离开的时刻。

输出格式:

若有车辆到达,则输出该汽车的停车位置;若有车辆离开,则输出该汽车在停车场内停留的时间。如果汔车号码不存在,输出the car not in park

输入样例:

3
A 1 1 
A 2 2
A 3 3
D 1 4
A 4 5
A 5 6
D 4 7
D 5 8
E 0 0

输出样例:

car#1 in parking space #1
car#2 in parking space #2
car#3 in parking space #3
car#1 out,parking time 3
car#4 in parking space #3
car#5 waiting
car#4 out,parking time 2
car#5 in parking space #3
car#5 out,parking time 1

参考代码(非原创,GPT添加详细注释)

#include <iostream>
#include <string.h>
using namespace std;

int main()
{
    int n; // 声明n,表示停车场可以停放的汽车数量
    int place[11] = { 0 }; // 停车位数组,记录每个停车位上的汽车编号,初始值为0表示空位
    int time[11] = { 0 }; // 记录每个停车位上的汽车停留时间
    int wait[11] = { 0 }; // 等待队列数组,记录等待进入停车场的汽车编号
    int waiti = -1; // 等待队列的索引,初始值为-1表示没有车辆等待
    cin >> n; // 输入停车场的容量n

    while (1) {
        char x; // 操作类型字符,A表示到达,D表示离开,E表示结束
        int carnum, cartime; // carnum表示操作的汽车编号,cartime表示操作的时刻
        cin >> x >> carnum >> cartime; // 输入操作类型、汽车编号和操作时刻

        if (x == 'A') { // 如果是到达操作
            int flag = 0; // 用于标记是否找到空位
            for (int j = 1; j <= n; j++) { // 遍历停车位
                if (place[j] == 0) { // 如果找到空位
                    flag = j; // 记录空位的位置
                    break; // 跳出循环
                }
            }
            if (flag != 0) { // 如果找到了空位
                place[flag] = carnum; // 将汽车停入该空位
                cout << "car#" << carnum << " in parking space #" << flag << endl; // 输出停车信息
            }
            else { // 如果没有找到空位
                wait[++waiti] = carnum; // 将汽车加入等待队列
                cout << "car#" << carnum << " waiting" << endl; // 输出等待信息
            }
        }
        else if (x == 'D') { // 如果是离开操作
            int flag = 0; // 用于标记离开的汽车是否在停车位上
            for (int j = 1; j <= n; j++) { // 遍历停车位
                if (place[j] == carnum) { // 如果找到了要离开的汽车
                    flag = j; // 记录该汽车的停车位位置
                    break; // 跳出循环
                }
            }
            if (flag == 0) { // 如果没有找到该汽车
                cout << "the car not in park" << endl; // 输出车辆不在停车场的信息
            }
            else { // 如果找到了该汽车
                cout << "car#" << carnum << " out,parking time " << time[flag] << endl; // 输出离开信息和停留时间
                place[flag] = 0; // 清空该停车位
                time[flag] = 0; // 清空该停车位的停留时间
                for (int j = flag; j <= n; j++) { // 对后续的停车位进行移动处理
                    place[flag] = place[flag + 1];
                    time[flag] = time[flag + 1];
                    if (j == n) { // 如果是最后一个停车位
                        place[j] = 0; time[j] = 0; // 清空
                    }
                }
                if (waiti != -1) { // 如果有等待的车辆
                    place[flag] = wait[0]; // 将等待队列中的第一辆车停入刚刚空出的停车位
                    for (int j = 0; j < waiti; j++) { // 更新等待队列
                        wait[j] = wait[j + 1];
                    }
                    waiti--; // 等待队列的索引减1
                    cout << "car#" << place[flag] << " in parking space #" << flag << endl; // 输出停车信息
                }
            }
        }
        else if (x == 'E') { // 如果是结束操作
            break; // 跳出循环,结束程序
        }
        for (int j = 1; j <= n; j++) { // 更新所有停车位上的汽车的停留时间
            if (place[j] != 0) { // 如果停车位上有车
                time[j]++; // 停留时间加1
            }
        }
    }
    return 0;
}
posted @ 2024-03-11 21:31  yesno233233  阅读(98)  评论(0)    收藏  举报