2n皇后問題(經典遞迴回溯)

2021-10-05 01:42:57 字數 1465 閱讀 1728

問題描述

給定乙個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,...