当前位置:网站首页>LeetCode-1279. Traffic light intersection

LeetCode-1279. Traffic light intersection

2022-07-06 19:09:00 Border wanderer

This is the intersection of two roads . The first way is A road , The vehicle can move along  1 Heading from north to south , Can also be along  2 Heading from south to north . The second way is B road , The vehicle can move along  3 Drive from west to East in direction No , Can also be along 4 Drive from east to West in direction No .

Every road has a traffic light in front of the intersection . Traffic lights can be red or green .

The green light means that vehicles in both directions can pass the intersection .
The red light means that vehicles in both directions are not allowed to pass through the intersection , You must wait for the green light to come on .
Traffic lights on both roads cannot be green at the same time . It means , When A When the green light on the road comes on ,B The red light on the road will light up ; When B  When the green light on the road comes on ,A  The red light on the road will light up .

At the beginning of the ,A The green light on the road ,B The red light on the road is on . When the green light on a road lights up , All vehicles can pass through the intersection from any two directions , Until the green light on the other road . Vehicles on different roads cannot pass through the intersection at the same time .

Design a traffic light control system without deadlock for this intersection .

Implementation function  void carArrived(carId, roadId, direction, turnGreen, crossCar) :

carId  Is the number of the arriving vehicle .
roadId  Is the number of the road where the vehicle is located .
direction  For the direction of the vehicle .
turnGreen  It's a function , Calling this function will cause the green light on the current road to light up .
crossCar  It's a function , Calling this function will allow the vehicle to pass through the intersection .
When your answer avoids the deadlock of vehicles at the intersection , This answer will be considered correct . Turn on the green light when the green light has been on at the intersection , This answer will be considered wrong .

Example 1:

Input : cars = [1,3,5,2,4], directions = [2,1,2,4,3], arrivalTimes = [10,20,30,40,50]
Output : [
"Car 1 Has Passed Road A In Direction 2",    // A The traffic lights on the road are green ,1 Car No. 1 can pass through the intersection .
"Car 3 Has Passed Road A In Direction 1",    // The traffic lights are still green ,3 Car No. 2 goes through the intersection .
"Car 5 Has Passed Road A In Direction 2",    // The traffic lights are still green ,5 Car No. 2 goes through the intersection .
"Traffic Light On Road B Is Green",          // 2 Car number is B Road request green light .
"Car 2 Has Passed Road B In Direction 4",    // B The green light on the road is now on ,2 Car No. 2 goes through the intersection .
"Car 4 Has Passed Road B In Direction 3"     // The traffic lights are still green ,4 Car No. 2 goes through the intersection .
]
Example 2:

Input : cars = [1,2,3,4,5], directions = [2,4,3,3,1], arrivalTimes = [10,20,30,40,40]
Output : [
"Car 1 Has Passed Road A In Direction 2",    // A The traffic lights on the road are green ,1 Car No. 1 can pass through the intersection .
"Traffic Light On Road B Is Green",          // 2 Car number is B Road request green light .
"Car 2 Has Passed Road B In Direction 4",    // B The green light on the road is now on ,2 Car No. 2 goes through the intersection .
"Car 3 Has Passed Road B In Direction 3",    // B The green light on the road is now on ,3 Car No. 2 goes through the intersection .
"Traffic Light On Road A Is Green",          // 5 Car number is A Road request green light .
"Car 5 Has Passed Road A In Direction 1",    // A The green light on the road is now on ,5 Car No. 2 goes through the intersection .
"Traffic Light On Road B Is Green",          // 4 Car number is B Road request green light .4 Car No. 1 is waiting for the light at the intersection , until 5 Car No. 2 goes through the intersection ,B The green light on the road is on .
"Car 4 Has Passed Road B In Direction 3"     // B The green light on the road is now on ,4 Car No. 2 goes through the intersection .
]
explain : This is a deadlock free solution . Be careful , stay A The green light on the road 、5 Give way to... Before car No 4 Car No. 2 passed , It is also a correct and acceptable scheme .
 

Tips :

1 <= cars.length <= 20
cars.length = directions.length
cars.length = arrivalTimes.length
cars  All values in are unique .
1 <= directions[i] <= 4
arrivalTimes Non decreasing .

#include<iostream>
#include<functional>
#include<mutex>
using namespace std;
class TrafficLight {
public:
    TrafficLight() {
        road = 'A';
    }

    void carArrived(
        int carId,                   // ID of the car
        int roadId,                  // ID of the road the car travels on. Can be 1 (road A) or 2 (road B)
        int direction,               // Direction of the car
        function<void()> turnGreen,  // Use turnGreen() to turn light to green on current road
        function<void()> crossCar    // Use crossCar() to make car cross the intersection
    ) {
        std::lock_guard<mutex> lck(mtx);
        if (direction <= 2 && road != 'A') {
            turnGreen();
            road = 'A';
        }
        else if(direction > 2 && road!='B') {
            turnGreen();
            road = 'B';
        }
        crossCar();
    }
private:
    char road = 'A';
    std::mutex mtx;
};
原网站

版权声明
本文为[Border wanderer]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207061117257145.html

随机推荐