題目:
為了航空安全刀森,某國(guó)無人機(jī)出廠時(shí)都被安裝了一種芯片踱启。當(dāng)進(jìn)入監(jiān)控的區(qū)域時(shí),芯片都會(huì)向服務(wù)器回傳當(dāng)前的準(zhǔn)確位置信息(Signal)研底。
系統(tǒng)會(huì)將無人機(jī)回傳的信息記錄在一個(gè)文本文件中埠偿,每一條信息占據(jù)一行,格式如下:
規(guī)則一:當(dāng)無人機(jī)第一次進(jìn)入監(jiān)控區(qū)域的時(shí)候飘哨,會(huì)記錄如下的信息:{無人機(jī)ID} {X} {Y} {Z} 對(duì)于一架無人機(jī)來說胚想,這一定是第一條消息琐凭。
其中芽隆,
- 無人機(jī)ID為無人機(jī)的唯一標(biāo)識(shí),由數(shù)字和英文字母組成。
- X, Y, Z為無人機(jī)的位置坐標(biāo)胚吁,可以為正整數(shù)牙躺,可以為負(fù)整數(shù),也可以為0腕扶。
- 如果消息的格式不符合上述要求孽拷,則說明無人機(jī)處于故障狀態(tài)。
規(guī)則二:當(dāng)無人機(jī)已經(jīng)發(fā)送過第一條消息半抱,并持續(xù)在監(jiān)控區(qū)域活動(dòng)脓恕,則會(huì)記錄如下的信息:{無人機(jī)ID} {X'} {Y'} {Z'} {offsetX} {offsetY} {offsetZ}
其中,
- X'窿侈, Y'炼幔, Z' 代表該無人機(jī)前一條消息的坐標(biāo)。
- offsetX, offsetY, offsetZ代表該無人機(jī)相比于X'史简、Y'乃秀、Z' 的移動(dòng)量≡脖可知該條消息發(fā)送時(shí)跺讯,無人機(jī)的坐標(biāo)應(yīng)當(dāng)是(X'+offsetX, Y'+offsetY,
Z'+offsetZ)- 如果消息的格式不符合上述要求,或者(X'殉农、Y'刀脏、Z')和該無人機(jī)前一條消息的坐標(biāo)計(jì)算值不匹配,則說明無人機(jī)處于故障狀態(tài)统抬。
規(guī)則三:如果一旦判定一架無人機(jī)為故障狀態(tài)火本,無論接受到什么后續(xù)信息,該架無人機(jī)都處于故障狀態(tài)聪建。
- 故障狀態(tài)下钙畔,無人機(jī)的坐標(biāo)為(NA, NA, NA)
例如:
要求:
假設(shè)每一個(gè)文本文件中僅僅記錄一架無人機(jī)的信號(hào)。則請(qǐng)你書寫一個(gè)程序(或函數(shù))金麸,該程序的輸入有兩個(gè):
- 記錄著無人機(jī)活動(dòng)信號(hào)的文本文件(或者文本內(nèi)容}擎析。
- —個(gè)消息序號(hào)(Signal Index),該序號(hào)代表了第幾條消息(消息序號(hào)從0開始)。
輸出為(輸出可以是函數(shù)的返回值挥下,也可以是打印在console上):
- 若指定的消息不存在揍魂,則輸出Cannot find {消息序號(hào)}。
- 若指定的消息存在棚瘟,且無人機(jī)正常现斋,則輸出{無人機(jī)ID} {消息序號(hào)} {X} {Y} {Z}。
- 若指定的消息存在偎蘸,但無人機(jī)故障庄蹋,則輸出Error: {消息序號(hào)}瞬内。
例如對(duì)于輸入:
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當(dāng)指定消息ID 2時(shí),應(yīng)輸出plane1 2 3 4 5
當(dāng)指定消息ID 4時(shí)限书,應(yīng)輸出Error: 4
當(dāng)指定消息ID 100時(shí)虫蝶,應(yīng)輸出:Cannot find 100
先說一下整體思路吧!題目就是要求輸入無人機(jī)消息和消息序號(hào)倦西,然后你處理一下數(shù)據(jù)能真,求得該條消息下無人機(jī)的情況,然后按要求輸出扰柠。
主要要做的就是求當(dāng)前坐標(biāo)和判斷有沒有故障粉铐!這樣你才能按題目要求輸出
現(xiàn)在思路有了,但是我第一次看見這個(gè)題目的感覺就是輸入的限制特別多卤档。要考慮很多情況秦躯。我們按順序一個(gè)個(gè)來看這些坑。
- 當(dāng)無人機(jī)第一次進(jìn)入監(jiān)控區(qū)域的時(shí)候裆装,會(huì)記錄如下的信息:{無人機(jī)ID} {X} {Y} {Z} 對(duì)于一架無人機(jī)來說踱承,這一定是第一條消息。
這個(gè)無疑是一個(gè)很重要的條件哨免,第一行一定要滿足{無人機(jī)ID} {X} {Y} {Z}
這樣的格式茎活。
- 無人機(jī)ID為無人機(jī)的唯一標(biāo)識(shí),由數(shù)字和英文字母組成琢唾。
id由數(shù)字和英文字母組成载荔。說明還要用正則判斷一下id
- X, Y, Z為無人機(jī)的位置坐標(biāo),可以為正整數(shù)采桃,可以為負(fù)整數(shù)懒熙,也可以為0。
坐標(biāo)為整數(shù)普办,注意不能是別的字符
- 當(dāng)無人機(jī)已經(jīng)發(fā)送過第一條消息工扎,并持續(xù)在監(jiān)控區(qū)域活動(dòng),則會(huì)記錄如下的信息:{無人機(jī)ID} {X'} {Y'} {Z'} {offsetX} {offsetY} {offsetZ}
說明從第二條信息開始衔蹲,必須嚴(yán)格滿足{無人機(jī)ID} {X'} {Y'} {Z'} {offsetX} {offsetY} {offsetZ}
這種格式
- X'肢娘, Y', Z' 代表該無人機(jī)前一條消息的坐標(biāo)舆驶。
這個(gè) X'橱健, Y', Z' 不是隨隨便便寫的沙廉,必須和前一條消息的坐標(biāo)相對(duì)應(yīng)拘荡。這個(gè)應(yīng)該是最最重要的點(diǎn)了
- offsetX, offsetY, offsetZ代表該無人機(jī)相比于X'、Y'撬陵、Z' 的移動(dòng)量珊皿」倨#可知該條消息發(fā)送時(shí),無人機(jī)的坐標(biāo)應(yīng)當(dāng)是(X'+offsetX, Y'+offsetY,
Z'+offsetZ)
這個(gè)規(guī)則是在教我們?cè)趺从?jì)算無人機(jī)的當(dāng)前坐標(biāo)亮隙。和第5條對(duì)應(yīng)起來,某條消息的當(dāng)前坐標(biāo)應(yīng)該是下一條消息的X'垢夹、Y'溢吻、Z'
- 如果消息的格式不符合上述要求,或者(X'果元、Y'促王、Z')和該無人機(jī)前一條消息的坐標(biāo)計(jì)算值不匹配,則說明無人機(jī)處于故障狀態(tài)而晒。
一定要判斷清楚蝇狼,每個(gè)點(diǎn)都要判斷到位
- 如果一旦判定一架無人機(jī)為故障狀態(tài),無論接受到什么后續(xù)信息倡怎,該架無人機(jī)都處于故障狀態(tài)迅耘。
這個(gè)也要注意一些,但是我覺得這個(gè)應(yīng)該是最簡(jiǎn)單的监署。我們可以反向?qū)崿F(xiàn)颤专,也就是說初始狀態(tài)都是故障,然后一個(gè)個(gè)判斷是否故障钠乏。一有故障就可以break栖秕,后面的消息都不用再判斷了。
另外還有一些隱藏的點(diǎn)晓避。比如題目里說
假設(shè)每一個(gè)文本文件中僅僅記錄一架無人機(jī)的信號(hào)
那么一個(gè)文本文件里面就不能出現(xiàn)多個(gè)id簇捍。我把無人機(jī)id和前面不一樣的那條消息判斷為故障
還有,
—個(gè)消息序號(hào)(Signal Index),該序號(hào)代表了第幾條消息(消息序號(hào)從0開始)俏拱。
我自己實(shí)現(xiàn)的時(shí)候暑塑,是只要輸入非數(shù)字,就提示請(qǐng)輸入一個(gè)數(shù)字锅必;輸入負(fù)數(shù)的時(shí)候梯投,輸出Cannot find {序號(hào)}。負(fù)數(shù)的問題因?yàn)轭}目沒怎么詳細(xì)講况毅,所以應(yīng)該只要考慮到了就行分蓖。
還有,我考慮了空文本的問題尔许,也就是說一行消息也沒有么鹤。
我實(shí)現(xiàn)的是永遠(yuǎn)輸出Cannot find {序號(hào)}
另外,就是有空行的問題味廊,
中間有空行的情況我是這么實(shí)現(xiàn)的:比如像下面的輸入
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:{無人機(jī)ID} {消息序號(hào)} {X} {Y} {Z}
消息ID 5-8:Error: {消息序號(hào)}
消息ID >=9或<0:Cannot find {消息序號(hào)}
而末尾有空行的情況下蒸甜,我是直接把末尾的空行去掉了棠耕。
雖然題目好像并沒有說明這些情況該如何處理,但是還是要考慮得全面一點(diǎn)的哦~
然后輸入輸出一定要和題目要求嚴(yán)格一致的~這個(gè)做過題的都明白的柠新。說了這么多窍荧,我把我用js實(shí)現(xiàn)的代碼放在github上了:
https://github.com/thelastto/UAV