二、n皇后問題
將1~n這n個整數按照某個順序擺放的結果稱為這n個整數的乙個排列,而全排列是指這n個整數能形成的所有排列。例如對1、2、3這三個整數來說,(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)就是1-3的全排列,試求n個數的全排列。
/*
全排列問題,從遞迴的角度去考慮,把問題描述成「輸出1~n個整數的全排列」,就可以被分為若干個子問題:「輸出以1開頭的全排列」,「輸出以2開頭的全排列」...「輸出以n開頭的全排列」
不妨設定乙個陣列p用以存放當前排列;再設定乙個雜湊函式hashtable以記錄當前陣列中整數x是否已經在其中了。
*/# include
# include
using
namespace std;
//全域性變數
int n;
vector<
bool
> hashtable;
//長度不知,因此用vector
vector<
int> p;
void
generatep
(int index)
//對index位置處資料進行排列
for(
int i=
1;i<=n;i++
)//列舉1~n,試圖將i填入p[index]}}
intmain()
generatep(1
);}
n皇后問題是指在乙個n*n的西洋棋棋盤上放置n個皇后,使得這n個皇后兩兩均不在同一行、同一列、同一條對角線上,求出擺放方式的個數。
如果簡單列舉,當n=8時就有54502232次列舉,複雜度太大,因此考慮用新的演算法以降低複雜度。
由於已知n個皇后兩兩不在同一行/同一列,因此每一行必有唯一皇后,將每一行皇后的列號組合起來,我們就可以利用問題一中的全排列+判斷是否在同一對角線的方式獲知當前排列是否滿足條件,最終求得擺放方式的個數。
經過計算,這種方法在n=8時候只需要n!次列舉,共40320次,大大化簡了題目。
建議:在使用方案一的時候嘗試不要看一、全排列的**進行自主實現。
# include
# include
# include
using
namespace std;
int n,solution=0;
vector<
bool
> hashtable;
vector<
int> p;
void
generatep
(int index)}if
(flag)
printf
("\n");
}}for(
int i=
1;i<=n;i++)}
return;}
intmain()
generatep(1
);printf
("共有解法%d種"
,solution)
;}
上述方法直接解決問題,非常容易想到,當然在n比較小的情況下,複雜度也在能接受的範圍內,為了更進一步擴大n能夠接受的範圍,我們需要進一步優化演算法。
通過思考可以發下,已經放置了一部分皇后後(即已經生成了排列的一部分),剩餘皇后無論如何放置都不可能合法,就沒必要繼續遞迴了,直接返回上層即可。
換言之,我們將判斷的過程放入到遞迴中,減少遞迴的層數以達到優化演算法的目的。
一般來說,如果在達到遞迴邊界前的某層,由於設定的約束條件已經不需要繼續遞迴而可以直接返回上一層的方法,被稱為回溯法。
# include
# include
# include
using
namespace std;
int n,solution=0;
vector<
bool
> hashtable;
vector<
int> p;
void
generatep
(int index)
printf
("\n");
}for
(int i=
1;i<=n;i++)}
if(flag)}}
return;}
intmain()
generatep(1
);printf
("共有解法%d種"
,solution)
;}
遞迴 全排列 N皇后
遞迴求出全排列,如輸出1到5的全排列 include const int maxn 11 int n,p maxn p存放已經排進來的數,n即為要求輸出1 n的全排列 bool hashtable maxn void generatep int index printf n return for i...
遞迴 全排列與n皇后
輸出全排列利用遞迴實現 每一層遞迴排列好乙個數字,抵達邊界就輸出 include using namespace std int n,p 11 hashtable 11 void generatep int index for int x 1 x n x int main n皇后問題可以理解為全排列...
4 3節全排列(遞迴理解)n皇后問題
在考慮全排列時,要想到根據1.2.3 的順序這樣輸出這個全排列,初始index 理解index為第幾個位置 為1,且hash均為false,當index為1,for迴圈此時停在i 1這個點往下遞迴過去 第一級遞迴 同理index為2,i 2 第二級遞迴 在index為4時輸出這個p陣列,return...