CF812A Sagheer and Crossroads 题解

Content

有一个十字路口,从最下面的部分开始,逆时针依次标号为 \(1,2,3,4\)。每个部分有四个灯,分别为左转的灯、直行的灯、右转的灯以及人行通道灯(只有可能为红灯和绿灯)。如果某个部分的人行横道的灯光和可以到达或离开该部分的车道的灯光同时为绿灯,则可能会发生交通事故。现在,给出四个部分的 \(16\) 个灯的情况(\(0\) 表示红灯、\(1\) 表示绿灯),请你预测是否会发生交通事故。

Solution

直接暴力判断情况即可,只不过判断的条件有些多罢了。

这里借用一下题面的图来详细讲解:

我们可以很容易地发现,只要人行横道灯是绿色,并且在这个部分中左转、直行、右转的灯中有一个灯亮绿灯,那么就会发生交通事故。

当然,除了上面这些以外,还有一些情况也会发生交通事故:

  1. \(1\) 号部分的人行横道灯亮绿灯,并且 \(2\) 号部分的左转灯、\(3\) 号部分的直行灯、\(4\) 号部分的右转灯中有一个灯亮绿灯。
  2. \(2\) 号部分的人行横道灯亮绿灯,并且 \(1\) 号部分的右转灯、\(3\) 号部分的左转灯、\(4\) 号部分的直行灯中有一个灯亮绿灯。
  3. \(3\) 号部分的人行横道灯亮绿灯,并且 \(1\) 号部分的直行灯、\(2\) 号部分的右转灯、\(4\) 号部分的左转灯中有一个灯亮绿灯。
  4. \(4\) 号部分的人行横道灯亮绿灯,并且 \(1\) 号部分的左转灯、\(2\) 号部分的直行灯、\(3\) 号部分的右转灯中有一个灯亮绿灯。

上面这些都用一个 \(\texttt{if}\) 来判断就好。条件很多,需要细心和耐心。

Code

#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

int l[7], r[7], s[7], p[7];

int main() {
	for(int i = 1; i <= 4; ++i)	scanf("%d%d%d%d", &l[i], &s[i], &r[i], &p[i]);
	if((p[1] && (l[1] || s[1] || r[1] || l[2] || s[3] || r[4])) || (p[2] && (r[1] || l[2] || s[2] || r[2] || l[3] || s[4])) || (p[3] && (s[1] || r[2] || l[3] || s[3] || r[3] || l[4])) || (p[4] && (l[1] || s[2] || r[3] || l[4] || s[4] || r[4])))	printf("YES");
	else	printf("NO");
	return 0;
}
posted @ 2021-12-21 20:56  Eason_AC  阅读(42)  评论(0)    收藏  举报