题目描述:
这是两条路的交叉路口。第一条路是 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 是非递减的。

方法1:使用信号量
主要思路:
(1)使用信号量保证对路口的拥有,并使用变量flag标识当前的路径之前是否为green的路径,若不是,则需要调用truegreen函数,改变路灯为绿灯,同时调整flag为当前路径(因为当前路径为green);
(2)当当前车通过后,将拥有权先释放;

#include<semaphore.h>
class TrafficLight {public:sem_t sem;int flag;//标识为绿灯的路径号TrafficLight() {flag=1;sem_init(&sem,0,1);}void carArrived(int carId,                   // ID of the carint roadId,                  // ID of the road the car travels on. Can be 1 (road A) or 2 (road B)int direction,               // Direction of the carfunction<void()> turnGreen,  // Use turnGreen() to turn light to green on current roadfunction<void()> crossCar    // Use crossCar() to make car cross the intersection) {sem_wait(&sem);//先尝试获得拥有路口的权利//若当前路径不是之前为绿灯的路径,则调整路灯和路径if(flag!=roadId){turnGreen();flag=3-flag;}crossCar();sem_post(&sem);//释放拥有权}
};

方法2:使用互斥量
主要思路:
(1)这里由于信号量的初始值是1,则可以直接使用互斥量代替信号量;

#include<pthread.h>
class TrafficLight {public:pthread_mutex_t mutex;int flag;TrafficLight() {flag=1;pthread_mutex_init(&mutex,0);}void carArrived(int carId,                   // ID of the carint roadId,                  // ID of the road the car travels on. Can be 1 (road A) or 2 (road B)int direction,               // Direction of the carfunction<void()> turnGreen,  // Use turnGreen() to turn light to green on current roadfunction<void()> crossCar    // Use crossCar() to make car cross the intersection) {pthread_mutex_lock(&mutex);if(flag!=roadId){turnGreen();flag=3-flag;}crossCar();pthread_mutex_unlock(&mutex);}
};

1279 红绿灯路口相关推荐

  1. LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口

    目录 1114. 按序打印 解法 1115. 交替打印FooBar 解法 1116. 打印零与奇偶数 解法 1117. H2O 生成 解法 1118. 设计有限阻塞队列 解法 1195. 交替打印字符 ...

  2. 【LeetCode-多线程】1279. 红绿灯路口

    目录 一.题目 二.解决 1.synchronized 2.CAS 3.Lock 4.信号量 三.参考 一.题目 这是两条路的交叉路口.第一条路是 A 路,车辆可沿 1 号方向由北向南行驶,也可沿 2 ...

  3. LeetCode(多线程)- 1279. 红绿灯路口

    题目链接:点击打开链接 题目大意:略. 解题思路:略. 相关企业 亚马逊(Amazon) 高盛集团(Goldman Sachs) 苹果(Apple) 微软(Microsoft) 谷歌(Google) ...

  4. 畅游多线程之红绿灯路口

    1279 红绿灯路口 每条路在路口前都有一个红绿灯.红绿灯可以亮起红灯或绿灯.绿灯表示两个方向的车辆都可通过路口. 红灯表示两个方向的车辆都不可以通过路口,必须等待绿灯亮起. 两条路上的红绿灯不可以同 ...

  5. 坡道行驶电动小车_事发红绿灯路口!东莞一女子骑电动滑板车被撞致颅内出血…...

    东莞的小伙伴们应该都在路上见过电动滑板车一些上班族平时都用它代步但大家在享受电动滑板车的便捷时一定要提高安全意识否则就容易发生意外!事件回顾近日在东莞厚街S256省道濠畔红绿灯路口发生一起电动滑板车与 ...

  6. 科目三 临时停车 与 红绿灯 路口 LTS

    科目三 临时停车 与 红绿灯 路口 LTS 临时停车 ,需要双闪不 昨天考挂了,绿灯还有12妙没有过,安全员判定不合格 教练说十秒内可以停/ 2挡不超30码就不会出现档位车速不配色.红绿灯也没规定挂空 ...

  7. LeetCode题解(1279):红绿灯路口(Python)

    题目:原题链接(简单) 标签:多线程 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(N)O(N)O(N) O(1)O(1)O(1) 52ms (88.89%) Ans 2 ...

  8. LeetCode-1279. 红绿灯路口

    这是两条路的交叉路口.第一条路是 A 路,车辆可沿 1 号方向由北向南行驶,也可沿 2 号方向由南向北行驶.第二条路是 B 路,车辆可沿 3 号方向由西向东行驶,也可沿 4 号方向由东向西行驶. 每条 ...

  9. Leetcode_1279_红绿灯路口_多线程

    用一个布尔型变量保存目前红绿灯状态. 如果目前的车能通过红绿灯,就让他通过. 如果不能,改变灯的状态. class TrafficLight {boolean isAGreen; public Tra ...

最新文章

  1. 导出txt文件宏_利用solidwords二次开发导出三维曲面方阵点坐标方法
  2. GPU 2014年4月 性能排名
  3. POJ-1201 Intervals---差分约束
  4. python对文件夹内文件去重
  5. SeqGAN——对抗思想与增强学习的碰撞
  6. nssl1256-C(盟主的忧虑)【并查集】
  7. 万能高品质PSD分层促销海报,电商美工必备
  8. System.getProperty
  9. struts2 result随笔
  10. java第七章jdbc课后简答题_Java进阶之JDBC面试题(7)
  11. java学习笔记_Java大白话学习笔记(01)—数组以及内存图解
  12. COMSOL光纤建模、光子带隙分析等
  13. Qt 之 QPainter
  14. fgo服务器维护2018,fgo迦勒底男性精选2018推荐召唤开启 fgo4月20日维护公告_游侠手游...
  15. pandas 中的 isin和isnotin
  16. 划重点 传输层协议 tcp三次握手和四次挥手
  17. 使用Visual Leak Detector工具检测内存泄漏
  18. 后端 php mysql_搭建并部署PHP + MySQL后端环境
  19. win7计算机无法连接投影仪,win7系统下投影仪无法输出信号到电脑的解决方法
  20. 图片压缩工具Thumbnailator的使用

热门文章

  1. android+qq浏览器,良心发现之作 QQ浏览器5.0安卓内测版体验
  2. 去文件中逗号并换行的小程序
  3. javascript继承实现
  4. 我用Python批量读取考生成绩单,并自动发送录取通知书邮件
  5. java计算机毕业设计基于ssm的火车订票管理系统(源代码+数据库+Lw文档)
  6. 【原创动画】真封神如何使用PAK解包压缩解密
  7. block、inline和inline-block
  8. 挡不住了,中国芯片制造产业链的重大突破,5nm设备即将发给台积电
  9. 一文说清 GIS、GPS、RS、LBS 区别与联系
  10. mysql isnull()用法