回溯法解決N皇后問題 遞迴與非遞迴求解

2021-06-07 06:32:41 字數 627 閱讀 7847

回溯法其實也是一種搜尋演算法,它可以方便的搜尋解空間。 

回溯法解題通常可以從以下三步入手: 

1、針對問題,定**空間 

2、確定易於搜尋的解空間結構 

3、以深度優先的方式搜尋解空間,並在搜尋的過程中進行剪枝 

回溯法通常在解空間樹上進行搜尋,而解空間樹通常有子集樹和排列樹。 

針對這兩個問題,演算法的框架基本如下: 

用回溯法搜尋子集合樹的一般框架

void backtrack(int t)

}}

不過我這裡沒考慮演算法效率,網上有用公式求解,還有利用位操作進行計算的,有興趣的可以關注下。

#include #include #include using namespace std;

void queen_n(int n);

int main()

bool place(int *x,int col,int n)

{ for(int i=0;in-1 )

{ sum ++;

printf("column\trow\n");

for(int i=0;i=0)

{ x[i] += 1;

while(j

關於回溯法的遞迴與非遞迴 N皇后問題

藍橋杯 基礎練習 2n皇后問題給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於8。輸入格式 輸入的第一行為乙個整數n...

回溯法解決n皇后問題

回溯法的基本行為是搜尋,搜尋過程使用剪枝函式來為了避免無效的搜尋。剪枝函式包括兩類 1.使用約束函式,剪去不滿足約束條件的路徑 2.使用限界函式,剪去不能得到最優解的路徑。1 針對所給問題,確定問題的解空間 首先應明確定義問題的解空間,問題的解空間應至少包含問題的乙個 最優 解。2 確定結點的擴充套...

回溯法解決N皇后問題

在棋盤上放置8個皇后,使得它們互不攻擊,此時每個皇后的攻擊範圍為同行同列和同對角線,要求找出所有解。遞迴函式將不再遞迴呼叫它自身,而是返回上一層呼叫,這種現象稱為回溯 backtracking 當把問題分成若干步驟並遞迴求解時,如果當前步驟沒有合法選擇,則函式將返回上一級遞迴呼叫,這種現象稱為回溯。...