日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

杭电oj1072java实现bfs

發(fā)布時(shí)間:2025/3/20 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 杭电oj1072java实现bfs 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)。
附上代碼:

import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; /** 寬搜,優(yōu)先隊(duì)列優(yōu)化*/ public class 杭電1072bfs {static int n,m,x1=0,y1=0,x2,y2,min;//行 列 初始點(diǎn) 結(jié)束點(diǎn) 結(jié)果static int d[][]= {{1,0},{0,-1},{-1,0},{0,1}};//上左下右 public static void main(String[] args) {Scanner sc =new Scanner(System.in); int T=sc.nextInt();//測(cè)試用例 while(T-->0){min=64; //看清范圍,這個(gè)是極限 n=sc.nextInt();m=sc.nextInt();//行 列int a[][]=new int[n][m]; //儲(chǔ)存數(shù)據(jù) for(int i=0;i q1=new PriorityQueue<>(valuecompare);//優(yōu)先隊(duì)列 q1.add(new node(x1,y1,0,6));while(!q1.isEmpty()){ node exa=q1.poll();//返回頭節(jié)點(diǎn)并刪除 int x=exa.x,y=exa.y;if(exa.x==x2&&exa.y==y2) {if(exa.time>0&&min>exa.value) {min=exa.value;}}else if(exa.time==0) {;}elsefor(int i=0;i<4;i ){if(x d[i][1]<0||y d[i][0]<0||x d[i][1]>=n||y d[i][0]>=m){continue;}//不越界else{if(a[x d[i][1]][y d[i][0]]==1) //普通路徑{ q1.add(new node(x d[i][1],y d[i][0],exa.value 1,exa.time-1)); } else if(a[x d[i][1]][y d[i][0]]==4)//重置區(qū){ if(exa.time==1) {}else{q1.add(new node(x d[i][1],y d[i][0],exa.value 1,6)); a[x d[i][1]][y d[i][0]]=0;}}else if((a[x d[i][1]][y d[i][0]]==3))//結(jié)果區(qū),讓再循環(huán)外判斷{ q1.add(new node(x d[i][1],y d[i][0],exa.value 1,exa.time-1));;} }}} }public static Comparator valuecompare =new Comparator()//接口{@Overridepublic int compare(node arg0, node arg1) { return (int)(arg0.value-arg1.value);} }; } class node//點(diǎn) {int x;int y;int value;int time;public node(int x,int y,int value,int time){this.x=x;this.y=y;this.value=value;this.time=time;} }

總結(jié)

以上是生活随笔為你收集整理的杭电oj1072java实现bfs的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。