时间轴
时间轴
2025-11-30
init
题目:
经典回溯问题,考虑每一行只能且必须放一个皇后,然后每次回溯考虑下一行放哪里。注意标记能被攻击的区域时要-1 而不是赋值为-1。这是避免两个皇后可以同时攻击一个区域。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 | using std::vector;class Solution { private: int cnt; void backtrace(vector<vector<int> > &board, int row, int n) { if (row == n) { this->cnt++; return; } int i, j, k; for (j = 0; j < n; j++) { // column if (board[row][j] == 0) { for (i = row + 1; i < n; i++) { //set column of other row board[i][j] -= 1; } i = row + 1; k = j + 1; while (i < n && k < n) { board[i][k] -= 1; i++; k++; } i = row + 1; k = j - 1; while (i < n && k >= 0) { board[i][k] -= 1; i++; k--; } board[row][j] = 1; backtrace(board, row + 1, n); i = row + 1; k = j + 1; while (i < n && k < n) { board[i][k] += 1; i++; k++; } i = row + 1; k = j - 1; while (i < n && k >= 0) { board[i][k] += 1; i++; k--; } for (i = row + 1; i < n; i++) { //set column of other row board[i][j] += 1; } board[row][j] = 0; } } } public: int totalNQueens(int n) { this->cnt = 0; vector<vector<int> > board = vector(n, vector<int>(n, 0)); backtrace(board, 0, n); return cnt; }};int main(){ Solution S; S.totalNQueens(4);} |
