基礎練習 2n皇后問題 dfs

2021-07-27 09:21:59 字數 1300 閱讀 4808

問題描述

給定乙個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皇后問題

然後在做這個 這個是公升級版的皇后問題。

這裡我們要我們填充兩種皇后,那麼我們先一種一種來填,填完這種然後在填另一種.

方法和n皇后問題差不多,我們開兩個陣列  

a[i] b[i] i為皇后所在的行 a[i] b[i] 所存值為換行所在的列 

,然後列舉可行的列,並用陣列記錄位置,然後判斷是否存在同一列同一對角線的情況(因為這裡我們是按行填充的所以肯定滿足了不在同一行的情況).

利用等腰直角三角形來判斷是否在對角線上 即 abs(a[step]-a[j])==step-j?  step-j 為行 a[step]-a[j]為列 判斷同一列很好判斷

填充完一種皇后後再填另一種(注意0 1是否能放皇后)

判斷兩個皇后是否重疊 : 填第二種皇后時 需要判斷 

b[step]==a[step]?

前面說了 陣列儲存的是該皇后所在行的列下標 那麼當二者相等時行下標一樣列下標相同那麼就在同一位置了 此時不可以.

#includeusing namespace std;

int n,sum;

int s[10][10];

int a[11],b[11];

void dfs2(int step)

for(int i=1;i<=n;i++)

}if(flag)//如果不滿足要繼續找

}return ;

}void dfs1(int step)

for(int i=1;i<=n;i++)

}if(flag)

}return ;

}int main()

基礎練習 2n皇后問題

資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於...

DFS 藍橋杯試題 基礎練習 2n皇后問題

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

試題 基礎練習 2n皇后問題

提交此題 評測記錄 資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多...