java 實(shí)現(xiàn)迷宮回溯算法示例詳解
用一個(gè)7 x 7的矩形表示迷宮,0和1分別表示的是通路和障礙。通過設(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沒有走過)、(1障礙)、(2走過且為正確的路線)、(3走過且為錯(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:沒有走過 1:障礙 2:走過且為正確的路線 3:走過且為錯(cuò)誤的路線 if (maze[5][5] == 2) {//找到通路 return true; } else { if (maze[i][j] == 0) { //當(dāng)前點(diǎn)沒走過,按策略走 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)無法走通 maze[i][j] = 3; return false;//返回到上個(gè)方法(即返回到上個(gè)點(diǎn)) } } else { //該點(diǎn)為 1或2或3,無法走通,直接返回上個(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot啟動(dòng)加載數(shù)據(jù)原理分析
實(shí)際應(yīng)用中,我們會有在項(xiàng)目服務(wù)啟動(dòng)的時(shí)候就去加載一些數(shù)據(jù)或做一些事情這樣的需求。這時(shí)spring Boot 為我們提供了一個(gè)方法,通過實(shí)現(xiàn)接口 CommandLineRunner 來實(shí)現(xiàn)。下面給大家詳細(xì)介紹下,需要的的朋友參考下吧2017-04-04SpringCloud Gateway的路由,過濾器和限流解讀
這篇文章主要介紹了SpringCloud Gateway的路由,過濾器和限流解讀,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Struts 2 實(shí)現(xiàn)Action的幾種方式
本篇文章主要介紹了Struts 2 實(shí)現(xiàn)Action的幾種方式,Struts 2框架下實(shí)現(xiàn)Action類有三種方式,有興趣的可以了解一下2017-10-10Java實(shí)現(xiàn)AES加密和解密方式完整示例
這篇文章主要給大家介紹了關(guān)于Java實(shí)現(xiàn)AES加密和解密方式的相關(guān)資料,AES加密為最常見的對稱加密算法,是一種區(qū)塊加密標(biāo)準(zhǔn),這個(gè)標(biāo)準(zhǔn)用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用,需要的朋友可以參考下2023-10-10詳解Spring Data JPA動(dòng)態(tài)條件查詢的寫法
本篇文章主要介紹了Spring Data JPA動(dòng)態(tài)條件查詢的寫法 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06Spring計(jì)時(shí)器stopwatch使用詳解
這篇文章主要介紹了Spring計(jì)時(shí)器stopwatch使用詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08