1 条题解
-
1
#include <cstdlib> // abs using namespace std; const int MAXN = 10; int n; int board[MAXN][MAXN]; int blackQueens[MAXN]; // blackQueens[row] = col,-1表示未放置 int countAns; // 检查在 (row, col) 放置黑皇后是否合法 bool isValidBlack(int row, int col) { if (board[row][col] == 0) return false; for (int r = 0; r < row; r++) { int c = blackQueens[r]; if (c == col) return false; // 同列 if (abs(r - row) == abs(c - col)) return false; // 同对角线 } return true; } // 检查在 (row, col) 放置白皇后是否合法 bool isValidWhite(int row, int col, int whiteQueens[]) { if (board[row][col] == 0) return false; if (blackQueens[row] == col) return false; // 和黑皇后同格 for (int r = 0; r < row; r++) { int c = whiteQueens[r]; if (c == col) return false; // 同列 if (abs(r - row) == abs(c - col)) return false; // 同对角线 } return true; } // 回溯放置白皇后 void backtrackWhite(int row, int whiteQueens[]) { if (row == n) { countAns++; return; } for (int col = 0; col < n; col++) { if (isValidWhite(row, col, whiteQueens)) { whiteQueens[row] = col; backtrackWhite(row + 1, whiteQueens); whiteQueens[row] = -1; } } } // 回溯放置黑皇后 void backtrackBlack(int row) { if (row == n) { int whiteQueens[MAXN]; for (int i = 0; i < n; i++) whiteQueens[i] = -1; backtrackWhite(0, whiteQueens); return; } for (int col = 0; col < n; col++) { if (isValidBlack(row, col)) { blackQueens[row] = col; backtrackBlack(row + 1); blackQueens[row] = -1; } } } int main() { cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> board[i][j]; } blackQueens[i] = -1; } countAns = 0; backtrackBlack(0); cout << countAns << endl; return 0; }
信息
- ID
- 1305
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 9
- 标签
- 递交数
- 10
- 已通过
- 4
- 上传者