题目:
为了航空安全,某国无人机出厂时都被安装了一种芯片。当进入监控的区域时,芯片都会向服务器回传当前的准确位置信息(Signal)。
系统会将无人机回传的信息记录在一个文本文件中,每一条信息占据一行,格式如下:
规则一:当无人机第一次进入监控区域的时候,会记录如下的信息:{无人机ID} {X} {Y} {Z} 对于一架无人机来说,这一定是第一条消息。
其中,
- 无人机ID为无人机的唯一标识,由数字和英文字母组成。
- X, Y, Z为无人机的位置坐标,可以为正整数,可以为负整数,也可以为0。
- 如果消息的格式不符合上述要求,则说明无人机处于故障状态。
规则二:当无人机已经发送过第一条消息,并持续在监控区域活动,则会记录如下的信息:{无人机ID} {X'} {Y'} {Z'} {offsetX} {offsetY} {offsetZ}
其中,
- X', Y', Z' 代表该无人机前一条消息的坐标。
- offsetX, offsetY, offsetZ代表该无人机相比于X'、Y'、Z' 的移动量。可知该条消息发送时,无人机的坐标应当是(X'+offsetX, Y'+offsetY,
Z'+offsetZ)- 如果消息的格式不符合上述要求,或者(X'、Y'、Z')和该无人机前一条消息的坐标计算值不匹配,则说明无人机处于故障状态。
规则三:如果一旦判定一架无人机为故障状态,无论接受到什么后续信息,该架无人机都处于故障状态。
- 故障状态下,无人机的坐标为(NA, NA, NA)
例如:
要求:
假设每一个文本文件中仅仅记录一架无人机的信号。则请你书写一个程序(或函数),该程序的输入有两个:
- 记录着无人机活动信号的文本文件(或者文本内容}。
- —个消息序号(Signal Index),该序号代表了第几条消息(消息序号从0开始)。
输出为(输出可以是函数的返回值,也可以是打印在console上):
- 若指定的消息不存在,则输出Cannot find {消息序号}。
- 若指定的消息存在,且无人机正常,则输出{无人机ID} {消息序号} {X} {Y} {Z}。
- 若指定的消息存在,但无人机故障,则输出Error: {消息序号}。
例如对于输入:
plane1 1 1 1
plane1 1 1 1 1 2 3
plane1 2 3 4 1 1 1
plane1 3 4 5
plane1 1 1 1 1 2 3当指定消息ID 2时,应输出plane1 2 3 4 5
当指定消息ID 4时,应输出Error: 4
当指定消息ID 100时,应输出:Cannot find 100
先说一下整体思路吧!题目就是要求输入无人机消息和消息序号,然后你处理一下数据,求得该条消息下无人机的情况,然后按要求输出。
主要要做的就是求当前坐标和判断有没有故障!这样你才能按题目要求输出
现在思路有了,但是我第一次看见这个题目的感觉就是输入的限制特别多。要考虑很多情况。我们按顺序一个个来看这些坑。
- 当无人机第一次进入监控区域的时候,会记录如下的信息:{无人机ID} {X} {Y} {Z} 对于一架无人机来说,这一定是第一条消息。
这个无疑是一个很重要的条件,第一行一定要满足{无人机ID} {X} {Y} {Z}
这样的格式。
- 无人机ID为无人机的唯一标识,由数字和英文字母组成。
id由数字和英文字母组成。说明还要用正则判断一下id
- X, Y, Z为无人机的位置坐标,可以为正整数,可以为负整数,也可以为0。
坐标为整数,注意不能是别的字符
- 当无人机已经发送过第一条消息,并持续在监控区域活动,则会记录如下的信息:{无人机ID} {X'} {Y'} {Z'} {offsetX} {offsetY} {offsetZ}
说明从第二条信息开始,必须严格满足{无人机ID} {X'} {Y'} {Z'} {offsetX} {offsetY} {offsetZ}
这种格式
- X', Y', Z' 代表该无人机前一条消息的坐标。
这个 X', Y', Z' 不是随随便便写的,必须和前一条消息的坐标相对应。这个应该是最最重要的点了
- offsetX, offsetY, offsetZ代表该无人机相比于X'、Y'、Z' 的移动量。可知该条消息发送时,无人机的坐标应当是(X'+offsetX, Y'+offsetY,
Z'+offsetZ)
这个规则是在教我们怎么计算无人机的当前坐标。和第5条对应起来,某条消息的当前坐标应该是下一条消息的X'、Y'、Z'
- 如果消息的格式不符合上述要求,或者(X'、Y'、Z')和该无人机前一条消息的坐标计算值不匹配,则说明无人机处于故障状态。
一定要判断清楚,每个点都要判断到位
- 如果一旦判定一架无人机为故障状态,无论接受到什么后续信息,该架无人机都处于故障状态。
这个也要注意一些,但是我觉得这个应该是最简单的。我们可以反向实现,也就是说初始状态都是故障,然后一个个判断是否故障。一有故障就可以break,后面的消息都不用再判断了。
另外还有一些隐藏的点。比如题目里说
假设每一个文本文件中仅仅记录一架无人机的信号
那么一个文本文件里面就不能出现多个id。我把无人机id和前面不一样的那条消息判断为故障
还有,
—个消息序号(Signal Index),该序号代表了第几条消息(消息序号从0开始)。
我自己实现的时候,是只要输入非数字,就提示请输入一个数字;输入负数的时候,输出Cannot find {序号}。负数的问题因为题目没怎么详细讲,所以应该只要考虑到了就行。
还有,我考虑了空文本的问题,也就是说一行消息也没有。
我实现的是永远输出Cannot find {序号}
另外,就是有空行的问题,
中间有空行的情况我是这么实现的:比如像下面的输入
plane1 1 1 1
plane1 1 1 1 1 2 3
plane1 2 3 4 1 1 1
plane1 3 4 5 2 3 4
plane1 5 7 9 1 2 3plane1 6 9 12 0 0 0
plane1 6 9 12 1 1 -2
plane1 7 10 10 0 0 0
消息ID 0-4:{无人机ID} {消息序号} {X} {Y} {Z}
消息ID 5-8:Error: {消息序号}
消息ID >=9或<0:Cannot find {消息序号}
而末尾有空行的情况下,我是直接把末尾的空行去掉了。
虽然题目好像并没有说明这些情况该如何处理,但是还是要考虑得全面一点的哦~
然后输入输出一定要和题目要求严格一致的~这个做过题的都明白的。说了这么多,我把我用js实现的代码放在github上了:
https://github.com/thelastto/UAV
网友评论