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