回溯法:在遞迴構造中,生成和檢查的過程可以有機結合起來,從而減少不必要的列舉。把問題分解為若干個步驟求解時,如果當前步驟沒有合法選擇,則函式將返回上一級的遞迴呼叫,該現象稱為回溯法。所以遞迴列舉通常被稱為回溯。
8皇后問題:在8*8的棋盤上放置了8個皇后,使得他們互不攻擊,每個皇后的攻擊範圍為同行,同列和同對角線。要求找出共有多少種放法。
分析:最簡單的思路是列舉「64個格仔的子集」,使得子集中恰有8個格仔滿足條件。但是列舉64個格仔有2^64,顯然是個糟糕的模型。第二種思路是「從64個格仔中選8個,然後判斷是否滿足條件「,根據組合數可知這個方案達到10^9數量級,比第一種方案好,但是也不夠好。下面用回溯法來解決。用c[x]表示第x行
的皇后的列號,於是問題轉變為了8!=40320生成全排列問題。下面給出了回溯法解決8皇后問題的**:
int c[maxn];int ans;
void dfs(int curr,int n)
int i, j;
for (i = 0; i 可以繼續提高程式效率。用vis[3]來標記當前皇后所在的列和對角線是否有其他皇后的攻擊,測試了一下,時間大約比上面**快3倍多int vis[3][maxn];
int vis[3][maxn];
void dfs(int curr,int n)
for (int i = 0; i < n; i++)
}}
八皇后問題(回溯演算法)
八皇后問題是古老的問題,十八世紀由乙個西洋棋手提出的,即在乙個8 8 的西洋棋盤上,放置八個皇后,使它們不能相互攻擊到。即不能處於同一行,同一列,也不能處於同一條斜線上,問有多少種擺法。八皇后問題是經典的回溯演算法問題,後人利用計算機,算出了8 8 的棋盤上能擺出92種,而後又提出了n皇后問題。本人...
八皇后問題 回溯演算法
最近學習了一下列舉演算法,有兩種思路,遞迴構造和直接列舉。直接列舉的優點就是思路和程式很簡潔,缺點就在於無法簡便的減少列舉量,必須生成所有的解並進行判斷。遞迴構造就很簡單了,在生成列舉量的同時並且可以通過判斷減少列舉量從而達到了數量上的減少。簡單的說,直接列舉就是先找尋解再判斷,遞迴構造則是先判斷再...
回溯演算法 八皇后問題
問題描述 八皇后不能相互攻擊,即,八個皇后不能同行,同列,不同在同一條對角線上,對角線又可以分為左對角線和右對角線 左對角線上滿足 i j 7都相等 i,j分別是一維和二維的座標 右對角線滿足 i j 都相等 如下 include using namespace std int e q 8 8 in...