藍橋杯 基礎練習 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 不...