高级农民
- 积分
- 1672
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-9-12
- 最后登录
- 1970-1-1
|
错误原因是:
当某层的所有col位置用完了,我们要向上回溯的时候,可能不是仅仅level--向上只减一那么简单。比如
[x, ?, ?]
[x, x, x]
[x, x, x]
row: based-0-index, col: based-0-index
x 表示已经试过,? 表示没有试过。现在假设刚试完[2,2]位置上的col,此时row == 2的这层都试完了。此时向上回溯,我们应该回溯到row == 0 而不是 row == 1.
应该回溯的level 是 count数组从右向左数第一个非0的index.
改正后可以ac的代码:
- public class Solution {
- /*
- * @param n: The number of queens
- * @return: All distinct solutions
- */
- private Stack<Integer> stack = new Stack<>();
- public List<List<String>> solveNQueens(int n) {
- List<List<String>> results = new ArrayList<>();
- if (n <= 0) {
- return results;
- }
- int[] oneRes = new int[n];
- // 共有n个root节点
-
- int[] count = new int[n];
- for (int i = 0; i < n; i++) {
- stack.push(i);
- }
- int level = 0;
- count[level] = n;
- while (!stack.isEmpty()) {
- int col = stack.pop();
-
- count[level]--;
- // process col
- boolean available = isAvailable(n, oneRes, level, col);
- if (available) {
- oneRes[level] = col;
- if (level + 1 < n) {
- // cols: 0, 1, 2, ..., n-1
- // stack.push(cols);
- level++;
- count[level] = n;
- for (int j = 0; j < n; j++) {
- stack.push(j);
- }
- } else if (level + 1 == n){
- results.add(drawChessboard(oneRes));
- }
- }
- if (count[level] == 0) {
- // level--;
- level = updateLevel(count, level);
- }
- }
-
- return results;
- }
- private int updateLevel(int[] count, int curLevel) {
- int i = curLevel;
- while (i >= 1) {
- if (count[--i] != 0) break;
- }
- return i;
- }
- private List<String> drawChessboard(int[] cols) {
- List<String> chessboard = new ArrayList<>();
- for (int i = 0; i < cols.length; i++) {
- StringBuilder sb = new StringBuilder();
- for (int j = 0; j < cols.length; j++) {
- sb.append(j == cols[i] ? 'Q' : '.');
- }
- chessboard.add(sb.toString());
- }
- return chessboard;
- }
- private boolean isAvailable(int n, int[] queen, int row, int col) {
- for (int i = 1; row - i >= 0; i++) {
- int prevQ = queen[row - i];
- if (col == prevQ) {
- return false;
- }
- if (col - i >= 0 && col - i == prevQ) {
- return false;
- }
- if (col + i < n && col + i == prevQ) {
- return false;
- }
- }
- return true;
- }
- }
复制代码
|
|