当前位置:网站首页>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;
};
边栏推荐
- AvL树的实现
- Multithreading Basics: basic concepts of threads and creation of threads
- GCC【7】- 编译检查的是函数的声明,链接检查的是函数的定义bug
- ORACLE进阶(四)表连接讲解
- R language ggplot2 visualization: use ggviolin function of ggpubr package to visualize violin diagram
- Introduction to the use of SAP Fiori application index tool and SAP Fiori tools
- Lucun smart sprint technology innovation board: annual revenue of 400million, proposed to raise 700million
- Interview assault 63: how to remove duplication in MySQL?
- Help improve the professional quality of safety talents | the first stage of personal ability certification and assessment has been successfully completed!
- Penetration test information collection - WAF identification
猜你喜欢
Multithreading Basics: basic concepts of threads and creation of threads
Introduction to the use of SAP Fiori application index tool and SAP Fiori tools
Tongyu Xincai rushes to Shenzhen Stock Exchange: the annual revenue is 947million Zhang Chi and Su Shiguo are the actual controllers
Airiot IOT platform enables the container industry to build [welding station information monitoring system]
Optical blood pressure estimation based on PPG and FFT neural network [translation]
Php+redis realizes the function of canceling orders over time
Implementation of AVL tree
包装行业商业供应链管理平台解决方案:布局智慧供应体系,数字化整合包装行业供应链
Graffiti intelligence is listed on the dual main board in Hong Kong: market value of 11.2 billion Hong Kong, with an annual revenue of 300 million US dollars
Word如何显示修改痕迹
随机推荐
Crawling data encounters single point login problem
用于远程医疗的无创、无袖带血压测量【翻译】
安装Mysql报错:Could not create or access the registry key needed for the...
能源行业的数字化“新”运维
Tongyu Xincai rushes to Shenzhen Stock Exchange: the annual revenue is 947million Zhang Chi and Su Shiguo are the actual controllers
R language uses the order function to sort the dataframe data, and descending sorting based on a single field (variable)
helm部署etcd集群
Meilu biological IPO was terminated: the annual revenue was 385million, and Chen Lin was the actual controller
渲大师携手向日葵,远控赋能云渲染及GPU算力服务
使用map函数、split函数一行键入多个元素
Nuc11 cheetah Canyon setting U disk startup
五金机电行业智能供应链管理系统解决方案:数智化供应链为传统产业“造新血”
Penetration test information collection - WAF identification
青龙面板最近的库
openmv4 学习笔记1----一键下载、图像处理背景知识、LAB亮度-对比度
Mathematics in machine learning -- common probability distribution (XIII): Logistic Distribution
Some recruitment markets in Shanghai refuse to recruit patients with covid-19 positive
深度循环网络长期血压预测【翻译】
A wearable arm device for night and sleeveless blood pressure measurement [translation]
Introduction to the use of SAP Fiori application index tool and SAP Fiori tools