杭电oj1072java实现bfs
Nightmare
問(wèn)題描述
伊格內(nèi)修斯昨晚有一場(chǎng)噩夢(mèng)。他發(fā)現(xiàn)自己身陷迷宮,身上有一枚定時(shí)炸彈。迷宮有一個(gè)出口,在炸彈爆炸之前,伊格內(nèi)修斯應(yīng)該走出迷宮。炸彈的最初爆炸時(shí)間設(shè)定為6分鐘。為了防止炸彈爆炸,伊格內(nèi)修斯必須緩慢移動(dòng),即從一個(gè)區(qū)域移動(dòng)到最近的區(qū)域(也就是說(shuō),如果Ignatius現(xiàn)在站在(x,y)上,他只能在(x 1, y),(x-1,y),(x,y 1)或(x,y-1))在1分鐘內(nèi)。迷宮中的某個(gè)區(qū)域包含一個(gè)炸彈重置設(shè)備。他們可以將爆炸時(shí)間重置為6分鐘。
鑒于迷宮布局和伊格內(nèi)修斯的起始位置,請(qǐng)告訴伊格納修斯他是否可以走出迷宮,如果可以的話,輸出他必須用來(lái)尋找迷宮出口的最短時(shí)間,否則輸出-1。
以下是一些規(guī)則:
我們可以假設(shè)迷宮是2陣列。
2.每分鐘,伊格內(nèi)修斯都只能到最近的一個(gè)地方,他不應(yīng)該走出邊界,當(dāng)然他也不能在墻上行走。
3.如果伊格內(nèi)修斯在爆炸時(shí)間變?yōu)?時(shí)到達(dá)出口處,他就無(wú)法離開(kāi)迷宮。
4.如果伊格內(nèi)修斯在爆炸時(shí)間變?yōu)?時(shí)到達(dá)包含炸彈休息裝備的區(qū)域,他不能使用該裝備重置炸彈。
5.炸彈重置設(shè)備可以根據(jù)需要多次使用,如果需要的話,伊格內(nèi)修斯可以根據(jù)需要多次進(jìn)入迷宮中的任何區(qū)域。
6.重置爆炸時(shí)間的時(shí)間可以忽略,換句話說(shuō),如果伊格內(nèi)修斯到達(dá)包含炸彈休息裝備的區(qū)域,并且爆炸時(shí)間大于0,則爆炸時(shí)間將重置為6。
輸入
輸入包含多個(gè)測(cè)試用例。輸入的第一行是單個(gè)整數(shù)T,它是測(cè)試用例的數(shù)量。 T測(cè)試用例如下。
每個(gè)測(cè)試用例都以兩個(gè)表示迷宮大小的整數(shù)N和M(1 <= N,Mm = 8)開(kāi)始。然后N行,每行包含M個(gè)整數(shù)。該數(shù)組表示迷宮的布局。
有五個(gè)整數(shù)表示迷宮中不同類型的區(qū)域:
0:該地區(qū)是一堵墻,伊格內(nèi)修斯不應(yīng)該走上它。
1:該地區(qū)沒(méi)有任何東西,伊格內(nèi)修斯可以在其上行走。
2:伊格內(nèi)修斯的起跑位置,伊格內(nèi)修斯開(kāi)始逃離這個(gè)位置。
3:迷宮的出口,依納爵的目標(biāo)位置。
4:該區(qū)域包含一個(gè)炸彈重置設(shè)備,Ignatius可以通過(guò)步行到這些區(qū)域來(lái)延遲爆炸時(shí)間。
產(chǎn)量
對(duì)于每個(gè)測(cè)試案例,如果Ignatius可以走出迷宮,那么你應(yīng)該輸出他需要的最短時(shí)間,否則你應(yīng)該輸出-1。
示例輸入
3
3 3
2 1 1
1 1 0
1 1 3
4 8
2 1 1 0 1 1 1 0
1 0 4 1 1 0 4 1
1 0 0 0 0 0 0 1
1 1 1 4 1 1 1 3
5 8
1 2 1 1 1 1 1 4
1 0 0 0 1 0 0 1
1 4 1 0 1 1 0 1
1 0 0 0 0 3 0 1
1 1 4 1 1 1 1 1
示例輸出
4
-1
13
要求找到最小的走路次數(shù)值,并且用深搜無(wú)法剪枝,顯然是一道寬搜題。有一些注意點(diǎn):
1:普通的位置可以走多次,不需要標(biāo)記,因?yàn)橛锌赡芫蜑榱巳コ灾刂谜◤椀难b置就再某個(gè)邊角地方進(jìn)去一下出來(lái)一下。
2:重置的點(diǎn)需要標(biāo)記,因?yàn)橹刂玫狞c(diǎn)走過(guò)一次就夠了,因?yàn)榈谝淮沃刂迷擖c(diǎn)的總步數(shù)一定是最小的。
3:要用優(yōu)先隊(duì)列優(yōu)化,先出步數(shù)最少的那個(gè)點(diǎn),找到滿足條件的值就立馬break;因?yàn)閮?yōu)先隊(duì)列先彈出的是步數(shù)最小的那個(gè)點(diǎn),后面再?gòu)棾黾词節(jié)M足條件步數(shù)一定大于該點(diǎn)。
附上代碼:
總結(jié)
以上是生活随笔為你收集整理的杭电oj1072java实现bfs的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java中同时输入字符串和int类型出错
- 下一篇: 杭电1180java实现(bfs)