当前位置:网站首页>LeetCode-1279. 红绿灯路口
LeetCode-1279. 红绿灯路口
2022-07-06 11:17:00 【边界流浪者】
这是两条路的交叉路口。第一条路是 A 路,车辆可沿 1 号方向由北向南行驶,也可沿 2 号方向由南向北行驶。第二条路是 B 路,车辆可沿 3 号方向由西向东行驶,也可沿 4 号方向由东向西行驶。

每条路在路口前都有一个红绿灯。红绿灯可以亮起红灯或绿灯。
绿灯表示两个方向的车辆都可通过路口。
红灯表示两个方向的车辆都不可以通过路口,必须等待绿灯亮起。
两条路上的红绿灯不可以同时为绿灯。这意味着,当 A 路上的绿灯亮起时,B 路上的红灯会亮起;当 B 路上的绿灯亮起时,A 路上的红灯会亮起.
开始时,A 路上的绿灯亮起,B 路上的红灯亮起。当一条路上的绿灯亮起时,所有车辆都可以从任意两个方向通过路口,直到另一条路上的绿灯亮起。不同路上的车辆不可以同时通过路口。
给这个路口设计一个没有死锁的红绿灯控制系统。
实现函数 void carArrived(carId, roadId, direction, turnGreen, crossCar) :
carId 为到达车辆的编号。
roadId 为车辆所在道路的编号。
direction 为车辆的行进方向。
turnGreen 是一个函数,调用此函数会使当前道路上的绿灯亮起。
crossCar 是一个函数,调用此函数会允许车辆通过路口。
当你的答案避免了车辆在路口出现死锁,此答案会被认定为正确的。当路口已经亮起绿灯时仍打开绿灯,此答案会被认定为错误的。
示例 1:
输入: cars = [1,3,5,2,4], directions = [2,1,2,4,3], arrivalTimes = [10,20,30,40,50]
输出: [
"Car 1 Has Passed Road A In Direction 2", // A 路上的红绿灯为绿色,1 号车可通过路口。
"Car 3 Has Passed Road A In Direction 1", // 红绿灯仍为绿色,3 号车通过路口。
"Car 5 Has Passed Road A In Direction 2", // 红绿灯仍为绿色,5 号车通过路口。
"Traffic Light On Road B Is Green", // 2 号车在 B 路请求绿灯。
"Car 2 Has Passed Road B In Direction 4", // B 路上的绿灯现已亮起,2 号车通过路口。
"Car 4 Has Passed Road B In Direction 3" // 红绿灯仍为绿色,4 号车通过路口。
]
示例 2:
输入: cars = [1,2,3,4,5], directions = [2,4,3,3,1], arrivalTimes = [10,20,30,40,40]
输出: [
"Car 1 Has Passed Road A In Direction 2", // A 路上的红绿灯为绿色,1 号车可通过路口。
"Traffic Light On Road B Is Green", // 2 号车在 B 路请求绿灯。
"Car 2 Has Passed Road B In Direction 4", // B 路上的绿灯现已亮起,2 号车通过路口。
"Car 3 Has Passed Road B In Direction 3", // B 路上的绿灯现已亮起,3 号车通过路口。
"Traffic Light On Road A Is Green", // 5 号车在 A 路请求绿灯。
"Car 5 Has Passed Road A In Direction 1", // A 路上的绿灯现已亮起,5 号车通过路口。
"Traffic Light On Road B Is Green", // 4 号车在 B 路请求绿灯。4 号车在路口等灯,直到 5 号车通过路口,B 路的绿灯亮起。
"Car 4 Has Passed Road B In Direction 3" // B 路上的绿灯现已亮起,4 号车通过路口。
]
解释: 这是一个无死锁的方案。注意,在 A 路上的绿灯亮起、5 号车通过前让 4 号车通过,也是一个正确且可被接受的方案。
提示:
1 <= cars.length <= 20
cars.length = directions.length
cars.length = arrivalTimes.length
cars 中的所有值都是唯一的。
1 <= directions[i] <= 4
arrivalTimes 是非递减的。
#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;
};边栏推荐
- Penetration test information collection - App information
- 五金机电行业供应商智慧管理平台解决方案:优化供应链管理,带动企业业绩增长
- Based on butterfly species recognition
- 上海部分招工市場對新冠陽性康複者拒絕招錄
- First day of rhcsa study
- Mathematics in machine learning -- common probability distribution (XIII): Logistic Distribution
- Penetration test information collection - site architecture and construction
- Pychrm Community Edition calls matplotlib pyplot. Solution of imshow() function image not popping up
- Yutai micro rushes to the scientific innovation board: Huawei and Xiaomi fund are shareholders to raise 1.3 billion
- R语言使用rchisq函数生成符合卡方分布的随机数、使用plot函数可视化符合卡方分布的随机数(Chi Square Distribution)
猜你喜欢

Penetration test information collection - WAF identification
Three years of Android development, Android interview experience and real questions sorting of eight major manufacturers during the 2022 epidemic

The role of applet in industrial Internet

Method of accessing mobile phone storage location permission under non root condition

Countdown 2 days | live broadcast preview of Tencent cloud message queue data import platform

The list of people who passed the fifth phase of personal ability certification assessment was published

Helm deploy etcd cluster

Master Xuan joined hands with sunflower to remotely control enabling cloud rendering and GPU computing services

朗坤智慧冲刺科创板:年营收4亿 拟募资7亿

The second day of rhcsa study
随机推荐
Online notes
星诺奇科技IPO被终止:曾拟募资3.5亿元 年营收3.67亿
手写一个的在线聊天系统(原理篇1)
The list of people who passed the fifth phase of personal ability certification assessment was published
Interface test tool - postman
Lucun smart sprint technology innovation board: annual revenue of 400million, proposed to raise 700million
How does crmeb mall system help marketing?
R language uses DT function to generate t-distribution density function data and plot function to visualize t-distribution density function data
同宇新材冲刺深交所:年营收9.47亿 张驰与苏世国为实控人
Openmv4 learning notes 1 --- one click download, background knowledge of image processing, lab brightness contrast
渲大师携手向日葵,远控赋能云渲染及GPU算力服务
Simple understanding of MySQL database
五金机电行业供应商智慧管理平台解决方案:优化供应链管理,带动企业业绩增长
Optical blood pressure estimation based on PPG and FFT neural network [translation]
Analysis of frequent chain breaks in applications using Druid connection pools
用于远程医疗的无创、无袖带血压测量【翻译】
抽象类与抽象方法
R语言dplyr包进行数据分组聚合统计变换(Aggregating transforms)、计算dataframe数据的分组均值(mean)
If you have any problems, you can contact me. A rookie ~
[Matlab] Simulink 同一模块的输入输出的变量不能同名