Java數(shù)據(jù)結(jié)構(gòu) 遞歸之迷宮回溯案例講解
問題介紹:
用二維數(shù)組表示一個迷宮,設(shè)置迷宮起點和終點,輸出迷宮中的一條通路
實現(xiàn)思路:
二維數(shù)組表示迷宮:
0表示路且未走過、1表示墻、2表示通路,3表示已經(jīng)走過但走不通
設(shè)置尋路方法setWay,傳入地圖和坐標(biāo)參數(shù)
默認(rèn)方向策略:下、右、上、左
假定傳入的店沒有走過且可以走通,將其值置為2,然后向下尋路,也就是將坐標(biāo) (i + 1, j) 傳入尋路方法中
進(jìn)行遞歸尋路,向下移動后,再次按照方向策略進(jìn)行尋路,即再向下尋路,直到遇到死路,即下右左均走不通(因為將走過的路置為2,故向上也走不通,即遇到死路時回頭不算通路),則將該點置為3,并返回false,回到上一個遞歸,找尋方向策略中剩下的方向,實現(xiàn)回溯
代碼實現(xiàn):
public class Maze { public static void main(String[] args) { maze(); } //迷宮回溯問題 public static void maze() { //創(chuàng)建二維數(shù)組模擬迷宮 //使用1表示墻,0表示路 int[][] map = new int[][]{ {1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 0, 0, 1}, {1, 0, 1, 0, 0, 0, 1}, {1, 0, 1, 0, 1, 1, 1}, {1, 1, 0, 0, 0, 0, 1}, {1, 0, 1, 1, 0, 1, 1}, {1, 0, 0, 0, 0, 0, 1}, {1, 1, 1, 1, 1, 1, 1} }; //輸出地圖 System.out.println("迷宮:"); for (int[] row : map) { for (int i : row) { System.out.printf("%d\t", i); } System.out.println(); } System.out.println("尋路結(jié)果:"); //開始尋路 setWay(map, 1, 1); //輸出地圖 for (int[] row : map) { for (int i : row) { System.out.printf("%d\t", i); } System.out.println(""); } } //傳入地圖map //傳入開始位置(i, j) //如果能到達(dá)右下角(6, 5),則說明找到通路 //0表示未走過,1表示墻,2表示可以走的通路,3表示已經(jīng)走過,但是走不通 //確定方向策略:下 -> 右 -> 上 -> 左 //若該點走不通,則回溯 public static boolean setWay(int[][] map, int i, int j) { if (map[6][5] == 2) { //通路已經(jīng)找到 return true; } else { if (map[i][j] == 0) { //如果當(dāng)前點沒有走過 map[i][j] = 2; //假定該點可以走通 if (setWay(map, i + 1, j)) { //向下走 return true; } else if (setWay(map, i, j + 1)) { //向右走 return true; } else if (setWay(map, i - 1, j)) { //向上走 return true; } else if (setWay(map, i, j - 1)) { //向左走 return true; } else { //該點走不通 map[i][j] = 3; return false; } } else { //如果map[i][j] != 0 //可能是1、2、3 return false; } } } }
輸出結(jié)果:
迷宮: 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 1 1 1 1 1 0 0 0 0 1 1 0 1 1 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 尋路結(jié)果: 1 1 1 1 1 1 1 1 2 2 2 0 0 1 1 3 1 2 0 0 1 1 3 1 2 1 1 1 1 1 0 2 2 0 1 1 0 1 1 2 1 1 1 0 0 0 2 2 1 1 1 1 1 1 1 1
到此這篇關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之遞歸之迷宮回溯案例講解的文章就介紹到這了,更多相關(guān)Java數(shù)據(jù)結(jié)構(gòu)之遞歸之迷宮回溯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析使用jdbc,hibernate處理clob/blob字段的詳解
本篇是對使用jdbc,hibernate處理clob/blob字段進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05file.mkdir()、file.mkdirs()和file.createNewFile()的區(qū)別
本文主要介紹了file.mkdir()、file.mkdirs()和file.createNewFile()的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04Java、C++中子類對父類函數(shù)覆蓋的可訪問性縮小的區(qū)別介紹
這篇文章主要給大家介紹了關(guān)于Java、C++中子類對父類函數(shù)覆蓋的可訪問性縮小的區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01SpringBoot創(chuàng)建監(jiān)聽器的方法示例
在Java中,監(jiān)聽器(Listener)是一種設(shè)計模式,它允許對象在 特定事件 發(fā)生時 自動執(zhí)行某些操作,這種設(shè)計模式通常用于實現(xiàn) 發(fā)布-訂閱模型,本文給大家介紹了SpringBoot創(chuàng)建監(jiān)聽器的方法示例,感興趣的通過可以參考一下2024-04-04SpringCloud將Nacos作為配置中心實現(xiàn)流程詳解
這篇文章主要介紹了Springcloud中的Nacos Config服務(wù)配置,本文以用戶微服務(wù)為例,進(jìn)行統(tǒng)一的配置,結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10Spring?Data?Jpa?中原生查詢?REGEXP?的使用詳解
這篇文章主要介紹了Spring?Data?Jpa?中原生查詢?REGEXP?的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12