题解 | #N皇后问题#
N皇后问题
https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6
描述
N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后,
要求:任何两个皇后不同行,不同列也不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。
要求:任何两个皇后不同行,不同列也不在同一条斜线上,
求给一个整数 n ,返回 n 皇后的摆法数。
数据范围: 1 \le n \le 91≤n≤9
要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n!)O(n!)
例如当输入4时,对应的返回值为2,
对应的两种四皇后摆位如下图所示:
class Solution { public: /** * * @param n int整型 the n * @return int整型 */ int a[10];//保存第几行的皇后在哪,如a[6]=2表示第6行的皇后在第2列 int cnt = 0;//计数器 //判断该该位置能否插入皇后 bool check(int row, int i) { for (int j = 1; j <= row; ++j) { if (a[j] == i) return false;//同一列不行 if (a[j] + j == (row + i)) return false;//反斜线不行 if (a[j] - j == i - row) return false;//正斜线不行 } return true; } //深度优先搜索 void dfs(int row,int n) { //当行数超过n,则摆法数+1 if (row == n + 1) { cnt++; return; } //对当前行的每一列进行判断 for (int i = 1; i <= n; ++i) { if (check(row, i)) { a[row] = i; dfs(row + 1,n); a[row] = 0; } } } int Nqueen(int n) { dfs(1,n); return cnt; } };
#n皇后#