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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

杭电1180java实现(bfs)

發布時間:2025/3/20 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 杭电1180java实现(bfs) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

詭異的樓梯:
多組數據輸入M N,表示大小然后輸入地圖。*表示墻壁,’.‘表示可以通過,S初始,T結尾位置,‘-’,‘|’代表初始樓梯狀況,每隔一秒就會換成對方。-左右走,跳過樓梯,|上下走,跳過樓梯(相當于走兩格)
分析:
1:首先要確定上下 和左右的參數設置,不能搞混,我選擇a[x][y],x代表上下(行)
2:找到時間最短的點,說明是bfs,并且為了防止爆內存,還要標記走過的路,樓梯不標記,標記過的位置不在走。用的隊列還要用優先隊列優化
3:難點是’-'和‘|’的處理。因為每秒都會變一次,所以可以要看時間,time%2=0;表示遇到的就是原始的樓梯,time%2=1,代表遇到的是相反的樓梯。
4:難點2就是停留的問題,普通的路是不會停留的,只有遇到樓梯才可能停留,這就是遇到的樓梯過不去的狀況,就要判斷過去會不會越界,過去的那個點是否已經走過。只有滿足條件,對面的點沒去過,才會等一次。
附上代碼:

import java.util.Comparator; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner;public class 杭電1180 {static int x[]={0,1,0,-1};static int y[]={1,0,-1,0};//右 上 做 下 static int m,n; static int x1=0,y1=0,x2=0,y2=0;//起點和抹點static char a[][]=new char[20][20];public static void main(String[] args) {Scanner sc=new Scanner(System.in); while(sc.hasNext()){ m=sc.nextInt();//行 n=sc.nextInt();//列 sc.nextLine(); boolean b[][]=new boolean[m][n];//標記是否被走過 for(int i=0;i q1=new PriorityQueue(timecomepare2); //優先隊列優化 q1.add(new zuobiao(x1,y1,0));while(!q1.isEmpty()){zuobiao zuo=q1.poll();//取頭并且拋出int x3=zuo.x;int y3=zuo.y; if(x3==x2&&y3==y2) {System.out.println(zuo.time);break;}else for(int i=0;i<4;i ){ if(x3 x[i]=0&&y3 y[i]=0&&!b[x3 x[i]][y3 y[i]]) //這個點沒有訪問過 { if(a[x3 x[i]][y3 y[i]]=='.')//普通情況,不考慮樓梯{b[x3 x[i]][y3 y[i]]=true;q1.add(new zuobiao(x3 x[i],y3 y[i],zuo.time 1)); }/** 遇到豎直樓梯,1:上下方向的偶時間可行* 2:左右方向的奇時間可行*/if(a[x3 x[i]][y3 y[i]]=='|')//豎直樓梯 要看時間{if(zuo.time%2==1&&(i==0||i==2))//奇數時間 相當于‘-’; {if(y3 y[i] y[i]=0){ b[x3 x[i] x[i]][y3 y[i] y[i]]=true;q1.add(new zuobiao(x3 x[i] x[i],y3 y[i] y[i],zuo.time 1));}}else if(zuo.time%2==0&&(i==1||i==3))//偶數時間 上下 {if(x3 x[i] x[i]=0){ b[x3 x[i] x[i]][y3 y[i] y[i]]=true; q1.add(new zuobiao(x3 x[i] x[i],y3 y[i] y[i],zuo.time 1));} } else if(y3 y[i] y[i]=0&&x3 x[i] x[i]=0) {//沒爬過去并且符合條件if(b[x3 x[i] x[i]][y3 y[i] y[i]]==false)q1.add(new zuobiao(x3,y3,zuo.time 1));}//并且沒有被爬過一定要看看是否被爬過,內存卡爆}/** 遇到-方向 1:偶數時間左右方向* 2:奇數時間的上下方向 */if(a[x3 x[i]][y3 y[i]]=='-')//豎直樓梯只能左右走,走兩步{if(zuo.time%2==1&&(i==1||i==3))//左右{if(x3 x[i] x[i]=0){ b[x3 x[i] x[i]][y3 y[i] y[i]]=true; q1.add(new zuobiao(x3 x[i] x[i],y3 y[i] y[i],zuo.time 1));}}else if(zuo.time%2==0&&(i==0||i==2))//偶數時間 {if(y3 y[i] y[i]=0)//符合條件(可以跳過去){ b[x3 x[i] x[i]][y3 y[i] y[i]]=true; q1.add(new zuobiao(x3 x[i] x[i],y3 y[i] y[i],zuo.time 1));}} else if(y3 y[i] y[i]=0&&x3 x[i] x[i]=0){if(b[x3 x[i] x[i]][y3 y[i] y[i]]==false)q1.add(new zuobiao(x3,y3,zuo.time 1));}}if (a[x3 x[i]][y3 y[i]]=='T'){ b[x3 x[i]][y3 y[i]]=true;q1.add(new zuobiao(x3 x[i],y3 y[i],zuo.time 1));} }} } } public static Comparator timecomepare2 =new Comparator()//實現comparator接口 {public int compare(zuobiao a1,zuobiao a2){return (int)(a1.time-a2.time);}}; }class zuobiao { int x;int y;int time; //走的次數/時間public zuobiao(int x,int y,int time){this.x=x;this.y=y;this.time=time; } }

總結

以上是生活随笔為你收集整理的杭电1180java实现(bfs)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。