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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

杭电1010java实现dfs

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

題目:
問題描述
小狗在一個(gè)古老的迷宮中發(fā)現(xiàn)了一塊骨頭,這讓他著迷了很多。然而,當(dāng)他拾起它時(shí),迷宮開始動(dòng)搖,小狗可能感覺到地面下沉。他意識(shí)到骨頭是一個(gè)陷阱,他拼命地試圖走出這個(gè)迷宮。

迷宮是一個(gè)大小為N的矩形。在迷宮中有一扇門。一開始,門被關(guān)閉,并在短時(shí)間內(nèi)(不到1秒)在第T秒打開。因此小狗不得不在第T秒鐘到達(dá)門口。每一秒,他都可以將一個(gè)街區(qū)移到上,下,左,右相鄰街區(qū)之一。一旦他進(jìn)入一個(gè)街區(qū),這個(gè)街區(qū)的地面就會(huì)開始沉沒,并在下一秒消失。他不能在一個(gè)街區(qū)停留超過一秒鐘,也不能進(jìn)入訪問區(qū)塊。這只可憐的小狗能生存嗎?請幫助他。
輸入
輸入由多個(gè)測試用例組成。每個(gè)測試用例的第一行包含三個(gè)整數(shù)N,M和T(范圍打出來后面會(huì)顯示不出來)分別表示迷宮的大小和門打開的時(shí)間。接下來的N行給出迷宮布局,每行包含M個(gè)字符。一個(gè)字符是以下之一:
‘X’:小狗不能進(jìn)入的一堵墻;
‘S’:小狗的起點(diǎn);
‘D’:門;要么
‘?!?#xff1a;空白塊。
輸入以三個(gè)0結(jié)束。這個(gè)測試用例不被處理。
產(chǎn)量
對于每個(gè)測試案例,如果小狗能夠存活,則在一行中打印“是”,否則打印“否”。
示例輸入
4 4 5
S.X.
…X.
…XD

3 4 5
S.X.
…X.
… d
0 0 0
示例輸出
NO
YES
這是我第一個(gè)做的深搜題,講一下我做這題的錯(cuò)誤和進(jìn)步過程
1:我最初只使用普通的搜索題,利用遞歸回溯可以找到結(jié)果。但是超時(shí)
2:看了網(wǎng)上的分析之后,才明白要剪枝,就是把不可能的情況減掉,我看了別人的剪枝,才知道原來兩個(gè)點(diǎn)的奇偶性和走的步數(shù)的奇偶密切相關(guān),即:偶數(shù)點(diǎn)到偶數(shù)點(diǎn)(坐標(biāo)xy之和)需要走偶數(shù)次,奇數(shù)到奇數(shù)也要走偶數(shù)次。說明兩點(diǎn)%2的結(jié)果如果相同就會(huì)走偶數(shù)次。相反則走奇數(shù)次,經(jīng)過優(yōu)化后if((x1 y1 x2 y2)%2 t%2==1) {return;}除了主要的這個(gè),還想到了步數(shù)能不能到達(dá),步數(shù)會(huì)不會(huì)超過所有路的問題。
3:發(fā)現(xiàn)還是超時(shí),后來才想明白需要走一步剪枝規(guī)范去掉沒用的,這樣減少的次數(shù)是不僅僅初始的那個(gè)狀態(tài)。這樣優(yōu)化后理論上可以ac
4:但是我依然超時(shí),做了很多嘗試,發(fā)現(xiàn)我的dfs函數(shù)的參數(shù)過多,我把他寫在外面靜態(tài)區(qū)域,就成功ac了。可以看代碼
代碼如下:(被注釋部分代碼就是超時(shí)而沒法過的最初形式)

import java.util.Scanner; public class Main {static int d[][]= {{-1,0},{0,-1},{1,0},{0,1}};//上左下右static boolean judgle=false;static int n,m,t,x2,y2;public static void main(String[] args) { Scanner sc=new Scanner(System.in);while(sc.hasNext()){n=sc.nextInt();//行數(shù)m=sc.nextInt();//列數(shù)t=sc.nextInt();//門打開的時(shí)間sc.nextLine();if(n==0&&m==0&&t==0)break;char a[][]=new char[n][m];boolean b[][]=new boolean[n][m];//判斷是否有障礙boolean c[][]=new boolean[n][m];//走過記錄int x1=0,y1=0;for(int i=0;i<n;i++)//賦值{String exa=sc.nextLine(); a[i]=exa.toCharArray();}for(int i=0;i<n;i++)//賦值{for(int j=0;j<m;j++)//賦值{if(a[i][j]=='X') {b[i][j]=true;}//有障礙else if(a[i][j]=='S') {x1=i;y1=j;}//起點(diǎn)else if(a[i][j]=='D') {x2=i;y2=j;}//結(jié)束點(diǎn)}}c[x1][y1]=true;// if((x1+y1+x2+y2)%2+t%2==1) {judgle=false;} if(t>=m*n) {judgle=false;}//時(shí)間超了// else if(t<Math.abs(y1-y2)+Math.abs(x2-x1)) {judgle=false;} // else {dfs(b,c,x1,y1);}if(judgle) {System.out.println("YES");judgle=false;}else{System.out.println("NO");}} }//private static void dfs( boolean[][] b,boolean c[][], int x1, int y1, int x2, int y2,int m,int n,int t) {private static void dfs( boolean b[][], boolean c[][], int x1, int y1) { if(t==0) {if(x1==x2&&y1==y2)judgle=true;return;} //到達(dá)終點(diǎn)else if((x1+y1+x2+y2)%2+t%2==1) {return;} else if(t<Math.abs(y1-y2)+Math.abs(x2-x1)) {return;}else{for(int i=0;i<4;i++){int x=x1,y=y1;if(x1+d[i][1]<0||y1+d[i][0]<0||x1+d[i][1]>=n||y1+d[i][0]>=m){continue;}//不越界else{if(!b[x1+d[i][1]][y1+d[i][0]]&&!c[x1+d[i][1]][y1+d[i][0]]) //you障礙 { x=x+d[i][1];y=y+d[i][0];t--;c[x][y]=true; if(t==0&&x==x2&&y==y2) {judgle=true;break;} dfs(b,c,x,y); c[x][y]=false;t++; } } }} } }

不知道還有什么優(yōu)化的方法,希望大佬能過指出!
微信公眾號:bigsai,期待您的關(guān)注!

總結(jié)

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

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