點(diǎn)我挑戰(zhàn)題目
從零開始DFS HDOJ.1342 Lotto [從零開始DFS(0)] — DFS思想與框架/雙重DFS HDOJ.1010 Tempter of the Bone [從零開始DFS(1)] —DFS四向搜索/奇偶剪枝 HDOJ(HDU).1015 Safecracker [從零開始DFS(2)] —DFS四向搜索變種 HDOJ(HDU).1016 PRime Ring Problem (DFS) [從零開始DFS(3)] —小結(jié):做DFS題目的關(guān)注點(diǎn) HDOJ(HDU).1035 Robot Motion [從零開始DFS(4)]—DFS題目練習(xí) HDOJ(HDU).1241 Oil Deposits(DFS) [從零開始DFS(5)] —DFS八向搜索/雙重for循環(huán)遍歷 HDOJ(HDU).1258 Sum It Up (DFS) [從零開始DFS(6)] —DFS雙重搜索/去重技巧 HDOJ(HDU).1045 Fire Net [從零開始DFS(7)]—DFS練習(xí)/check函數(shù)的思想
給出地圖規(guī)模n * m, 給出入口坐標(biāo)(0,y),遵循以下規(guī)則,求解機(jī)器人能否走出地圖。若能,輸出走出地圖所需要的步數(shù),若不能,輸出進(jìn)入循環(huán)前走的步數(shù)和循環(huán)的步數(shù)。
規(guī)則: 若當(dāng)前格子為N,則只能向上走,若為S向下走,E向右走,W向左走。
我第一感覺是模擬題,因?yàn)閷τ诿總€(gè)格子狀態(tài)是唯一的,只有1組解:要么能走出去,要么不能。分別求出步數(shù)就行了,但感覺dfs能做,決定還是按照dfs的方法試一試。
分析一波: 遞歸邊界就是機(jī)器人走出了地圖或者是機(jī)器人走回到了走過的地方(吃回頭草了),即可判定輸出了。那么需要記錄的東西就是當(dāng)前走的步數(shù),和循環(huán)的步數(shù)。當(dāng)前走的步數(shù)好說,遞歸傳參+1就行了,循環(huán)的步數(shù)想想也不難:當(dāng)下一步就要吃回頭草的時(shí)候,兩個(gè)狀態(tài)的步數(shù)之差就是循環(huán)的步數(shù)。與先前的雙重搜索,四向搜索不同,dfs中要判斷這個(gè)格子的字符是什么,然后決定如何走下一步。
上代碼。
首先有3個(gè)全局變量保存著結(jié)果,分別是step,loop,beloop,分別保存著走出地圖用的步數(shù),循環(huán)的步數(shù),在循環(huán)之前的步數(shù)。 main函數(shù)完成初始化,check函數(shù)檢查是否走出地圖,若走出地圖則judge置為true并且終止遞歸。每一步把當(dāng)前的步數(shù)保存在visit[x][y]中,并且根據(jù)visit[x][y]是否為0判斷是否吃了“回頭草”。最后別忘了及時(shí)更新loop和beloop。
應(yīng)該來說是一道簡單的dfs應(yīng)用題。
從零開始DFS: HDOJ.1342 Lotto [從零開始DFS(0)] HDOJ.1010 Tempter of the Bone [從零開始DFS(1)] HDOJ(HDU).1015 Safecracker [從零開始DFS(2)] HDOJ(HDU).1015 Safecracker [從零開始DFS(3)]
新聞熱點(diǎn)
疑難解答