java 實(shí)現(xiàn)迷宮回溯算法示例詳解
用一個(gè)7 x 7的矩形表示迷宮,0和1分別表示的是通路和障礙。通過(guò)設(shè)計(jì)編寫程序找到藍(lán)色小球達(dá)到藍(lán)色旗子的路線

思路:
構(gòu)建一個(gè)迷宮(用二維數(shù)組)實(shí)現(xiàn)找通路的方法findRoad()
構(gòu)建二維數(shù)組不難,我們主要是要實(shí)現(xiàn)findRoad()這個(gè)方法,在實(shí)現(xiàn)這個(gè)方法前,我們需要約定好一下幾個(gè)點(diǎn):小球的位置當(dāng)作入口(1,1),小旗的位置當(dāng)作出口(5,5)數(shù)組里數(shù)的含義分別為(0沒(méi)有走過(guò))、(1障礙)、(2走過(guò)且為正確的路線)、(3走過(guò)且為錯(cuò)誤的路線)將我們每一步的走法稱為策略:下 -> 右 -> 上 ->左
實(shí)現(xiàn)
首先構(gòu)建出迷宮
public static void main(String[] args) {
//1.創(chuàng)建二維數(shù)組模擬迷宮
int[][] maze = new int[7][7];
//2.初始化迷宮
for (int i = 0; i < maze.length; i++) {
//maze[i][j]:i控制行 j:控制列
maze[0][i] = 1;//第1行都為1
maze[6][i] = 1;//最后一行都為1
maze[i][0] = 1;//第一列都為1
maze[i][6] = 1;//最后一列都為1
//其他位置的1
maze[4][1] = 1;
maze[4][2] = 1;
maze[4][3] = 1;
maze[4][4] = 1;
maze[3][4] = 1;
maze[2][3] = 1;
}
//打印迷宮
System.out.println("完成迷宮初始化:");
for (int i = 0; i < maze.length; i++) {
for (int j = 0; j < maze[i].length; j++) {
System.out.print(maze[i][j] + " ");
}
System.out.println();
}
}
然后寫findRoad()方法
* 使用遞歸回溯找通路 (5,5為出口)
* @param maze 迷宮
* @param i 從哪個(gè)位置開始找
* @param j 從哪個(gè)位置開始找
* @return 找到通路返回true 否則false
*/
public static boolean findRoad(int[][] maze, int i, int j) {
//策略:下 -> 右 -> 上 ->左
//0:沒(méi)有走過(guò) 1:障礙 2:走過(guò)且為正確的路線 3:走過(guò)且為錯(cuò)誤的路線
if (maze[5][5] == 2) {//找到通路
return true;
} else {
if (maze[i][j] == 0) {
//當(dāng)前點(diǎn)沒(méi)走過(guò),按策略走
maze[i][j] = 2;//當(dāng)前點(diǎn)改為2,假定能走通
if (findRoad(maze, i + 1, j)) {//向下走
return true;
} else if (findRoad(maze, i, j + 1)) {//向右走
return true;
} else if (findRoad(maze, i - 1, j)) {//向上走
return true;
} else if (findRoad(maze, i, j - 1)) {//向左走
return true;
} else {
//該點(diǎn)無(wú)法走通
maze[i][j] = 3;
return false;//返回到上個(gè)方法(即返回到上個(gè)點(diǎn))
}
} else {
//該點(diǎn)為 1或2或3,無(wú)法走通,直接返回上個(gè)方法(即上個(gè)點(diǎn))
return false;
}
}
}
main方法調(diào)用findRoad()方法,傳入創(chuàng)建好的迷宮,和入口點(diǎn)(1,1)
//mian方法中調(diào)用findRoad()方法
findRoad(maze,1,1);
//打印迷宮
System.out.println("完成路線的迷宮:");
for (int i = 0; i < maze.length; i++) {
for (int j = 0; j < maze[i].length; j++) {
System.out.print(maze[i][j] + " ");
}
System.out.println();
}
效果

到此這篇關(guān)于java 實(shí)現(xiàn)迷宮回溯算法示例詳解的文章就介紹到這了,更多相關(guān)java 實(shí)現(xiàn)迷宮回溯算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用springboot整合RateLimiter限流過(guò)程
這篇文章主要介紹了使用springboot整合RateLimiter限流過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
spring boot啟動(dòng)加載數(shù)據(jù)原理分析
實(shí)際應(yīng)用中,我們會(huì)有在項(xiàng)目服務(wù)啟動(dòng)的時(shí)候就去加載一些數(shù)據(jù)或做一些事情這樣的需求。這時(shí)spring Boot 為我們提供了一個(gè)方法,通過(guò)實(shí)現(xiàn)接口 CommandLineRunner 來(lái)實(shí)現(xiàn)。下面給大家詳細(xì)介紹下,需要的的朋友參考下吧2017-04-04
SpringCloud Gateway的路由,過(guò)濾器和限流解讀
這篇文章主要介紹了SpringCloud Gateway的路由,過(guò)濾器和限流解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Struts 2 實(shí)現(xiàn)Action的幾種方式
本篇文章主要介紹了Struts 2 實(shí)現(xiàn)Action的幾種方式,Struts 2框架下實(shí)現(xiàn)Action類有三種方式,有興趣的可以了解一下2017-10-10
Java實(shí)現(xiàn)AES加密和解密方式完整示例
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)AES加密和解密方式的相關(guān)資料,AES加密為最常見(jiàn)的對(duì)稱加密算法,是一種區(qū)塊加密標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)用來(lái)替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用,需要的朋友可以參考下2023-10-10
Mybatis Trim標(biāo)簽用法簡(jiǎn)單介紹
這篇文章主要介紹了Mybatis Trim標(biāo)簽用法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05
詳解Spring Data JPA動(dòng)態(tài)條件查詢的寫法
本篇文章主要介紹了Spring Data JPA動(dòng)態(tài)條件查詢的寫法 ,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
Spring計(jì)時(shí)器stopwatch使用詳解
這篇文章主要介紹了Spring計(jì)時(shí)器stopwatch使用詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08

