Java數(shù)據(jù)結(jié)構(gòu) 遞歸之迷宮回溯案例講解
問(wèn)題介紹:
用二維數(shù)組表示一個(gè)迷宮,設(shè)置迷宮起點(diǎn)和終點(diǎn),輸出迷宮中的一條通路
實(shí)現(xiàn)思路:
二維數(shù)組表示迷宮:

0表示路且未走過(guò)、1表示墻、2表示通路,3表示已經(jīng)走過(guò)但走不通
設(shè)置尋路方法setWay,傳入地圖和坐標(biāo)參數(shù)
默認(rèn)方向策略:下、右、上、左
假定傳入的店沒(méi)有走過(guò)且可以走通,將其值置為2,然后向下尋路,也就是將坐標(biāo) (i + 1, j) 傳入尋路方法中
進(jìn)行遞歸尋路,向下移動(dòng)后,再次按照方向策略進(jìn)行尋路,即再向下尋路,直到遇到死路,即下右左均走不通(因?yàn)閷⒆哌^(guò)的路置為2,故向上也走不通,即遇到死路時(shí)回頭不算通路),則將該點(diǎn)置為3,并返回false,回到上一個(gè)遞歸,找尋方向策略中剩下的方向,實(shí)現(xiàn)回溯
代碼實(shí)現(xiàn):
public class Maze {
public static void main(String[] args) {
maze();
}
//迷宮回溯問(wèn)題
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),則說(shuō)明找到通路
//0表示未走過(guò),1表示墻,2表示可以走的通路,3表示已經(jīng)走過(guò),但是走不通
//確定方向策略:下 -> 右 -> 上 -> 左
//若該點(diǎn)走不通,則回溯
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)前點(diǎn)沒(méi)有走過(guò)
map[i][j] = 2; //假定該點(diǎn)可以走通
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 {
//該點(diǎn)走不通
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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Spring MVC獲取請(qǐng)求數(shù)據(jù)詳解操作
Spring MVC 是 Spring 提供的一個(gè)基于 MVC 設(shè)計(jì)模式的輕量級(jí) Web 開發(fā)框架,本質(zhì)上相當(dāng)于 Servlet,Spring MVC 角色劃分清晰,分工明細(xì)。由于 Spring MVC 本身就是 Spring 框架的一部分,可以說(shuō)和 Spring 框架是無(wú)縫集成2021-11-11
Springboot集成SSE實(shí)現(xiàn)單工通信消息推送流程詳解
SSE簡(jiǎn)單的來(lái)說(shuō)就是服務(wù)器主動(dòng)向前端推送數(shù)據(jù)的一種技術(shù),它是單向的,也就是說(shuō)前端是不能向服務(wù)器發(fā)送數(shù)據(jù)的。SSE適用于消息推送,監(jiān)控等只需要服務(wù)器推送數(shù)據(jù)的場(chǎng)景中,下面是使用Spring Boot來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的模擬向前端推動(dòng)進(jìn)度數(shù)據(jù),前端頁(yè)面接受后展示進(jìn)度條2022-11-11
springboot項(xiàng)目數(shù)據(jù)庫(kù)配置類DatabaseConfig示例詳解
這篇文章主要介紹了springboot項(xiàng)目數(shù)據(jù)庫(kù)配置類DatabaseConfig實(shí)現(xiàn)代碼,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-08-08
springboot項(xiàng)目如何在linux服務(wù)器上啟動(dòng)、停止腳本
這篇文章主要介紹了springboot項(xiàng)目如何在linux服務(wù)器上啟動(dòng)、停止腳本問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05
java實(shí)現(xiàn)同步回調(diào)的示例代碼
同步回調(diào)是一種在調(diào)用代碼中同步執(zhí)行回調(diào)函數(shù)的編程模式,在Java中,通過(guò)定義和實(shí)現(xiàn)接口來(lái)構(gòu)建同步回調(diào),本文就來(lái)介紹一下如何實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-09-09
SpringBoot實(shí)現(xiàn)公共字段自動(dòng)填充的方法步驟
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)公共字段自動(dòng)填充的方法步驟,文中通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-11-11
使用jquery 的ajax 與 Java servlet的交互代碼實(shí)例
這篇文章主要介紹了使用jquery 的ajax 與 Java servlet的交互代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
MyEclipse 2016 CI 4新增BootStrap模板
MyEclipse2016是一款全球使用最為廣泛的企業(yè)級(jí)開發(fā)環(huán)境程序,這篇文章主要介紹了MyEclipse 2016 CI 4新增BootStrap模板的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06

