*今天补了一下昨天实验室比赛的题目,发现一个题挺有意思,分享一下。
题目描述
现在很多地方的道路路口都安装了电子警察,即交通违章自动拍照系统。这些系统一般在路口的地下埋设感应线圈,通过传感器判断汽车是否在红灯时通过路面,来控制数码相机自动拍照。在安装这种系统需要挖掘地面,施工麻烦,成本又高。于是有人研究出了同摄像机自动识别车牌并判断违章行为的系统,这样一来,电子警察安装就方便多了,成本也大大降低。请你编程实现其中的一个功能,给出一批某一时间识别后的车牌号码及行进方向,判断该车是否违章,并记录下来。违章的规则设定为:先设置左转、直行、右转依次绿灯通行时间(以秒为单位,只允许一个方向绿灯),先左转绿灯,然后直行绿灯,最后右转绿灯,在其中一个绿灯时,其余两盏灯为红灯状态,假设时间生效在零时整,且给出的数据只限定当天。闯红灯为违章。
输入
第1行有4个整数,以一个空格隔开,依次为左转、直行、右转通行的绿灯持续秒数和识别的车辆数N(1≤N≤10000),后面的N行,表示每辆车的信息,格式为“时间+方向+车牌”,其中时间为6位数字,方向为1个字母(L表示左转,S表示直行,R表示右转),车牌为8个字符,之间没有空格。如081528LZJBB0001,表示车牌号为ZJBB0001的车辆在8时15分28秒左转。
输出
违章车辆的车牌号码,每辆车一行,不含空格,按输进去的先后顺序输出。
样例输入
复制样例数据
15 30 20 3
000046SZJBB8888
030950LJSAA9999
201509RBJC7777D
样例输出
ZJBB8888
BJC7777D
- 题目分析:
- 因为从零点开始,而且红绿灯是以秒为单位,所以可把时间全都转化为秒,对红绿灯时间总和取余,判断在那个时间段内,如果左右转符号不对应,即为违规。故代码如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
struct car{
int h,m,s;
char str[15];
};
car car[11000];
int main()
{
int go,left,right,n;
scanf("%d%d%d%d",&left,&go,&right,&n);
for(int i=1;i<=n;i++)
scanf("%2d%2d%2d%s",&car[i].h,&car[i].m,&car[i].s,car[i].str);
//格式化控制输入
int sum;
int circle;
for(int i=1;i<=n;i++)
{
sum=car[i].h*3600+car[i].m*60+car[i].s;//时间总和
circle=sum%(left+go+right);//对每一次循环时间取余
// printf("%d %d\n",sum,circle);
if(car[i].str[0]=='L')
{
if(circle>0&&circle<=left)
continue;
else
printf("%s\n",car[i].str+1);
}
if(car[i].str[0]=='S')
{
if(circle>left&&circle<=go+left)
continue;
else
printf("%s\n",car[i].str+1);
}
if(car[i].str[0]=='R')
{
if((circle>go+left&&circle<=right+go+left)||circle==0)
continue;
else
printf("%s\n",car[i].str+1);
}
}
return 0;
}
根据此题给出的样例(第二个没有违规),每一个边界界点,应属于前一个区域,所以取余为0时,可以右转,不可以直行或者左转!
菜鸟代码,大神勿喷!!!