問題描述
給定乙個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少種放法?n小於等於8。
輸入格式
輸入的第一行為乙個整數n,表示棋盤的大小。
接下來n行,每行n個0或1的整數,如果乙個整數為1,表示對應的位置可以放皇后,如果乙個整數為0,表示對應的位置不可以放皇后。
輸出格式
輸出乙個整數,表示總共有多少種放法。
樣例輸入
41 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
2樣例輸入
41 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
0**實現:
#include
using
namespace std;
int map[8]
[8];
//地圖
int vis[8]
[8];
//用於做標記
int n;
int count=0;
bool
cheak
(int i,
int j,
int color)
//要放皇后的座標i,j,color:1表示黑,2表示白
//判斷對角線
int ni=i-1;
int nj=j-1;
while
(ni>=
0&&nj>=0)
//左上角
//右上角
ni=i-
1; nj=j+1;
while
(ni>=
0&&nj//右下角
ni=i+
1; nj=j+1;
while
(ni//左下角
ni=i+
1; nj=j-1;
while
(ni=0)
return
true;}
void
dfsw
(int k)
//白皇后遞迴
for(
int i=
0;i)//該行有n個位置去嘗試
//一定要回溯
vis[k]
[i]=0;
}}}void
dfsb
(int k)
//遞迴黑皇后
for(
int i=
0;i)//一定要回溯
vis[k]
[i]=0;
}}}int
main()
回溯2 N皇后問題
在n n的方格棋盤放置了n個皇后,使得它們不相互攻擊 即任意2個皇后不允許處在同一排,同一列,也不允許處在與棋盤邊框成45角的斜線上。你的任務是,對於給定的n,求出有多少種合法的放置方法。input 共有若干行,每行乙個正整數n 10,表示棋盤和皇后的數量 如果n 0,表示結束。output 共有若...
2 3 遞迴 回溯 N皇后問題
分析 任意兩個皇后都不能處於同一行 同一列或同一斜線上。在第n行已放好的條件下,嘗試第n 1行,如果第n 1行均不滿足,嘗試n行的下乙個可能位置。回溯 在搜尋的過程中嘗試找到問題的解,如果發現找不到了,就退一步,往上回溯 剪枝過程 對於許多複雜問題和大規模問題都可以使用回溯法。按選優條件向前搜尋,以...
藍橋杯 遞迴回溯 八皇后問題 N皇后問題
大致思路 其實就是三個功能函式 place attack output solution place函式中的任務就是把所有的 設為有maxqueen個 皇后的列位置安頓好。其傳入的引數僅乙個,為皇后的序數q,然後經過i從1 maxqueen的遍歷找到該序數q的皇后應在的列數號,使queen q i,...