回溯算法解决迷宫问题
生活随笔
收集整理的這篇文章主要介紹了
回溯算法解决迷宫问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 前言
- 一、回溯法
- 二、算法應用——迷宮問題
- 1.問題描述
- 2.解題思路
- 三、Java代碼實現
前言
本文介紹一種經典算法——回溯法,可作為迷宮問題的一種解法。
一、回溯法
回溯是一種算法思想,用遞歸實現,類似于枚舉的搜索嘗試過程。主要思想在于搜索嘗試過程中尋找問題的解,當發現不滿足求解條件時,則立刻回溯返回,嘗試別的解決方案。可作為一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現該選擇不優或者無法達到目標,就退回一步重新進行選擇,而滿足回溯條件的某個狀態點稱為“回溯點”。
二、算法應用——迷宮問題
1.問題描述
迷宮問題是回溯法的一種應用。迷宮問題的描述為:假設主體放在一個迷宮地圖入口處,迷宮中有許多墻,使得大多數的路徑都被擋住而無法行進。主體可以通過遍歷所有可能到出口的路徑來到達出口。當主體走錯路時需要將走錯的路徑記錄下來,避免下次走重復的路徑,直到找到出口。主體需遵從如下三個原則:
- 一次步進只能走一格;
- 遇到路徑堵塞后,退后直到找到另一條路徑可行;
- 走過的路徑記錄下來,不會再走第二次。
2.解題思路
先創建一個二維數組Map[row][col]并進行初始化,Map[i][j]=1表示該位置有墻體無法通過,Map[i][j]=0表示該位置未走過,Map[i][j]=2表示該位置已經走過并且可以走通,Map[i][j]=3表示該位置已經走過并且無法走通。假設Map[1][1]為入口,Map[6][5]為出口。
當主體在迷宮行進的時候有四個方向即上下左右可以選擇,如圖所示:
三、Java代碼實現
public class MiGong {public static void main(String[] args) {//創建二維數組模擬迷宮int[][] map = new int[8][7];//使用1表示墻//上下置為1for (int i = 0; i < 7; i++){map[0][i] = 1;map[7][i] = 1;}//左右置為1for (int i = 0; i < 8; i++){map[i][0] = 1;map[i][6] = 1;}//擋板map[3][1] = 1;map[3][2] = 1;map[2][2] = 1;map[6][4] = 1;map[5][4] = 1;map[4][4] = 1;//輸出地圖System.out.println("原地圖:");for (int i = 0; i < 8; i++){for (int j = 0; j < 7; j++){System.out.print(map[i][j]+"\t");}System.out.println();}setWay(map,1,1);System.out.println("遞歸回溯后得到路線:");for (int i = 0; i < 8; i++){for (int j = 0; j < 7; j++){System.out.print(map[i][j]+"\t");}System.out.println();}}/*** 使用遞歸回溯找路* 1.i和j表示從地圖的(i,j)開始出發* 2.如果能走到map[6][5]則說明通路已經找到* 3.map[i][j]中 0:該點沒有走過 1:墻 2:該通路可以走 3:已經走過但是無法走通* 走迷宮時確定一個策略: 下->右->上->左 該點走不通再回溯* @param map 表示地圖的數組* @param i 從哪個位置開始找* @param j* @return 找到通路返回true 否則返回false*/public static boolean setWay(int[][] map,int i,int j){//通路已經找到if (map[6][5] == 2){return true;}else{//該點沒有走過if (map[i][j] == 0){//策略: 下->右->上->左//先賦值2假定可以走通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/3return false;}}} }測試結果如下:
原地圖: 1 1 1 1 1 1 1 1 0 0 0 0 0 1 1 0 1 0 0 0 1 1 1 1 0 0 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0 1 1 1 1 1 1 1 1 遞歸回溯后得到路線: 1 1 1 1 1 1 1 1 2 2 2 0 0 1 1 3 1 2 0 0 1 1 1 1 2 2 2 1 1 3 3 3 1 2 1 1 3 3 3 1 2 1 1 3 3 3 1 2 1 1 1 1 1 1 1 1以上。
如有不足或者錯誤歡迎評論指正。
總結
以上是生活随笔為你收集整理的回溯算法解决迷宫问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构:栈实现逆波兰计算器
- 下一篇: 递归回溯解决八皇后问题