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

2021-08-17 00:27:02 字數 1381 閱讀 4209

問題描述

給定乙個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先看一下n皇后問題的解法

#includeusing namespace std;

int ans, q[8], n;

void q(int row)

else

}if (flag)

q(row + 1);

} }}int main()

return 0;

}

回溯法,思路,因為每行必須放乙個,所以就省去了一維,每次只探索列數

所以用q(row)的遞迴深度代表行數,每次遞迴都探索該row行的全部列,放入皇后之後再檢查跟上面行的皇后是否相容,用q[8]存皇后的位置。

那麼回到本題,2n皇后問題,從n皇后問題拓展,我們可以認為是放兩次n皇后,也就是先放黑,滿足n黑皇后問題後在之前的情況之下再做n白皇后問題。

#includeusing namespace std;

int n, ans;

bool board[8][8];

int q[8][2];//拓展乙個長度來存白皇后位置

void q(int row, bool isblack)

if (row == n && !isblack)

if (isblack)

}if (flag)

q(row + 1, true);

}} }

else //白皇后

}if (flag) q(row + 1, false);

}} }

}int main()

} //地圖存完了,開始遍歷

q(0, true);

cout << ans << endl;

} return 0;

}

因為題目要求,在探索棋盤時還要注意該位置是否可以放棋子(以及該位置有沒有黑皇后)

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

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

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

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

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

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