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

2021-08-22 16:16:32 字數 1516 閱讀 4593

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

輸入格式

輸入的第一行為乙個整數n,表示棋盤的大小。

接下來n行,每行n個0或1的整數,如果乙個整數為1,表示對應的位置可以放皇后,如果乙個整數為0,表示對應的位置不可以放皇后。

輸出格式

輸出乙個整數,表示總共有多少種放法。

樣例輸入

4 1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

樣例輸出

2 樣例輸入

4 1 0 1 1

1 1 1 1

1 1 1 1

1 1 1 1

樣例輸出

0

定義乙個二維陣列當棋盤,挨個遍歷,每個位置分為放黑皇后或放白皇后或不放三個選擇;用回溯法的遞迴實現。

後來看了別人的**,自己的方法簡直太笨了,分析了一下有以下缺點

黑白一起考慮:這樣每個位置就多了乙個選擇,在遞迴的過程相當於時間複雜度多乘了個n;如果先考慮黑在考慮白,相當於時間複雜度乘以2。

遞迴:通常來說回溯法分為遞迴和非遞迴,遞迴的效率低一些。要練習使用非遞迴的方法。

黑白分開考慮,先看黑皇后,再看白。

用一位陣列代替,q[i]代表第i行上的皇后在第幾列。

用非遞迴。

#include 

#include

using namespace std;

int blq[8];//每行的黑皇后在第幾列

int whq[8];//每行的白皇后在第幾列

int n;

int can[8][8];//存放0/1,能否放皇后

int result=0;

bool place(int * q,int

x,inty)

return true;

}void whitequeen()

}if(whq[x]==-1)

if(whq[n-1]!=-1)

x++;

}}void blackqueen()

}if(blq[x]==-1)

if(blq[n-1]!=-1)

x++;

}}int main()

for(int i=0;iq[i]=-1;

whq[i]=-1;

}blackqueen();

cout參考部落格(思路詳解)

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

回溯法其實也是一種搜尋演算法,它可以方便的搜尋解空間。回溯法解題通常可以從以下三步入手 1 針對問題,定 空間 2 確定易於搜尋的解空間結構 3 以深度優先的方式搜尋解空間,並在搜尋的過程中進行剪枝 回溯法通常在解空間樹上進行搜尋,而解空間樹通常有子集樹和排列樹。針對這兩個問題,演算法的框架基本如下...

n皇后 回溯遞迴

遞迴回溯方法解決 n皇后問題 include include include using namespace std void queen int row int c 遞迴回溯本體 int is true int row int c 判斷是否當前旗子擺放符合條件 int n total 0 int ...

回溯法 八皇后問題的遞迴與非遞迴演算法

八皇后的問題非常有名,初次理解可能稍有難度,不過多看書,看部落格和 幾遍下來,也基本清晰。首先不用想初始的情況,先假設前面已經排列好了幾個皇后,即將排列下乙個皇后。依次遍歷八個位置,然後與之前的進行判斷這個位置是否可行,如可行則進行下乙個皇后,否則則移動位置繼續判斷。很簡單。但是有兩個個問題 1 不...