回溯演算法也叫試探法,它是一種系統地搜尋問題的解的方法。
用回溯演算法解決問題的一般步驟:
1 針對所給問題,定義問題的解空間,它至少包含問題的乙個(最優)解。
2 確定易於搜尋的解空間結構,使得能用回溯法方便地搜尋整個解空間 。
3 以深度優先的方式搜尋解空間,並且在搜尋過程中用剪枝函式避免無效搜尋。
問題的解空間通常是在搜尋問題解的過程中動態產生的,這是回溯演算法的乙個重要特性。
通俗的講,回溯就是不斷向前探索,一條陽關道走到黑,碰到死胡同就回來,追根溯源,追溯到剛剛走的岔路口,告訴自己這條路不能走了,把這條路拉黑,換一條。走下一條吧,然後以與剛剛同樣節奏的步伐開心愉悅的走到下乙個路口。
典型的回溯問題就是《迷宮》,如下圖,有乙個迷宮,小人兒每次只能走一格,每次有四個方向可以選擇,以下右上左的順序向前探索,如果四個方向都無法向前走的話,就回溯,即退回到剛剛那一步,轉向下乙個方向進行探索。這樣描述下來的話**就呼之欲出了,按照這樣的思路,**如下:
/*c語言編寫:
設定成多一圈牆的原因是為了讓最外面的格仔也有四個方向可以遍歷
* #include#include#define m 12
#define n 16
int count;
//初始化乙個迷宮陣列並設定道路 0表示牆,1表示路
int maze[m][n];
//初始化乙個偏移量陣列
int move[4][2]= ,,,};
//迷宮演算法
int maze(int x, int y)}}
return 0;
}int main(void)
,,,};//方向陣列
public
static
int x= 0,y= 0;//座標變數
public
static
boolean tag= false;//結束標誌位
/**迷宮演算法
*@return boolean*/
public
static
boolean
maze(int x , int y)}}
//方向全部遍歷完 說明沒有能走的方向,就退一步,return 到上乙個遞迴呼叫
return
false;
}public
static
void
main(string args)
}maze[1][1] =maze[1][2] =maze[1][3] =maze[1][4] =maze[1][5] =1;
maze[2][1] =maze[2][5] =maze[2][6] =1;
maze[3][1] =maze[3][2] =maze[3][6] =maze[3][7] =maze[3][8] =maze[3][9] =maze[3][10]=1;
maze[4][2] =maze[4][6] =maze[4][10]=maze[4][11]=1;
maze[5][2] =maze[5][11]=maze[5][12]=1;
maze[6][2] =maze[6][3] =maze[6][4] =maze[6][5] =maze[6][6] =maze[6][7] =maze[6][8] =maze[6][12]=1;
maze[7][3] =maze[7][8] =maze[7][12]=maze[7][13]=1;
maze[8][3] =maze[8][4] =maze[8][8] =maze[8][9] =maze[8][10]=maze[8][13]=1;
maze[9][10] =maze[9][11]=maze[9][12]=maze[9][13]=maze[9][14]=1;
maze[10][14]=1;
//呼叫maze
maze(1,1);
system.out.println("(1,1)←入口");
system.out.println("總共走的步數為:"+count);}}
迷宮(回溯演算法)
要想解決迷宮問題,首先搞明白八皇后,迷宮問題是回溯和貪心的產物。題目 現有乙個迷宮如圖 黃色五角星為迷宮的起點,紅色五角星為迷宮的終點。要求 找到從起點到終點的所有路線。思路 我們的目的為了到達終點,所以一定要向著終點的方向出發。因為迷宮的終點在起點的右下角。所以我們選擇路徑時先考慮向下走,走不通考...
演算法 迷宮問題 回溯
package datastructure.migong public class test for int i 0 i 8 i map 3 1 1 map 3 2 1 map 3 3 1 setway map,1,1 for int i map system.out.println 判斷當前點能否...
遞迴演算法 迷宮回溯問題
package com.czn.recursion public class migong for int i 0 i 8 i map 3 1 1 map 3 2 1 for int i 0 i 8 i system.out.println boolean setway setway map,1,1...