LeetCode52. N皇后 II
☆☆☆☆思路:如果在(i,j)处放置了一个皇后,那么
1. 整个第 i 行的位置都不能放置;
2. 整个第 j 列的位置都不能放置。
3. 如果位置(a,b)满足|a-i|==|b-j|,说明(a,b)和(i,j)处在同一条斜线上,也不能放置。
代码1(参考左神书,耗时2ms):
class Solution { int res = 0; public int totalNQueens(int n) { if (n < 1) return res; int[] record = new int[n]; // record[i]记录第i行皇后所在的列 dfs(0, n, record); return res; } private void dfs(int row, int n, int[] record) { if (row == n) { res ++; return; } for (int j = 0; j < n; j++) { //遍历列 if (isValid(record, row, j)) { record[row] = j; dfs(row + 1, n, record); } } } private boolean isValid(int[] record, int row, int j) { for (int k = 0; k < row; k++) { if (record[k] == j || Math.abs(row - k) == Math.abs(j - record[k])) { return false; } } return true; } }
代码2(最优解 -> 位运算加速):
M