杭电1010java实现dfs
題目:
問題描述
小狗在一個(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í)而沒法過的最初形式)
不知道還有什么優(yōu)化的方法,希望大佬能過指出!
微信公眾號:bigsai,期待您的關(guān)注!
總結(jié)
以上是生活随笔為你收集整理的杭电1010java实现dfs的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杭电1728bfs逃离迷宫java实现
- 下一篇: Java中同时输入字符串和int类型出错