Cover image for 面试经典150题 P52 N皇后 II

面试经典150题 P52 N皇后 II


时间轴

时间轴

2025-11-30

init


题目:

经典回溯问题,考虑每一行只能且必须放一个皇后,然后每次回溯考虑下一行放哪里。注意标记能被攻击的区域时要-1 而不是赋值为-1。这是避免两个皇后可以同时攻击一个区域。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
#include <vector>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);}
评论加载中…