题目
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.
Given an integer n, return all distinct solutions to the n-queens puzzle.
Each solution contains a distinct board configuration of the n-queens‘ placement, where ‘Q‘
and ‘.‘
both
indicate a queen and an empty space respectively.
For example,
There exist two distinct solutions to the 4-queens puzzle:
[ [".Q..", // Solution 1 "...Q", "Q...", "..Q."], ["..Q.", // Solution 2 "Q...", "...Q", ".Q.."] ]分析
用DFS递归得到所有结果,需要注意的是剪枝的时候有两种方式:
一种是遍历先前的皇后出现位置,判断当前行的可行位置,这种是节省空间,但时间复杂度较高(解法1);
另一种是用空间换时间,从列、主对角线、反对角线三个方向上纪录已经被占用的位置,从而直接判断出当前行的可用位置(解法2)。
解法1
import java.util.ArrayList; public class NQueens { private ArrayList<String[]> results; private int n; public ArrayList<String[]> solveNQueens(int n) { this.n = n; results = new ArrayList<String[]>(); // index: row, value: column int[] queue = new int[n]; dfs(0, queue); return results; } private void dfs(int row, int[] queue) { if (row == n) { results.add(constructResult(queue)); return; } for (int j = 0; j < n; ++j) { boolean valid = true; for (int i = 0; i < row; ++i) { if (queue[i] == j || Math.abs(j - queue[i]) == row - i) { valid = false; break; } } if (valid) { queue[row] = j; dfs(row + 1, queue); } } } private String[] constructResult(int[] queue) { String[] array = new String[n]; StringBuilder sb = new StringBuilder(); for (int i = 0; i < n; ++i) { sb.append(‘.‘); } for (int i = 0; i < n; ++i) { sb.setCharAt(queue[i], ‘Q‘); array[i] = sb.toString(); sb.setCharAt(queue[i], ‘.‘); } return array; } }
解法2
import java.util.ArrayList; public class NQueens { private ArrayList<String[]> results; private int n; private int[] column; private int[] mainDiag; private int[] antiDiag; private int[] queen; public ArrayList<String[]> solveNQueens(int n) { this.n = n; results = new ArrayList<String[]>(); column = new int[n]; mainDiag = new int[2 * n]; antiDiag = new int[2 * n]; queen = new int[n]; dfs(0); return results; } private void dfs(int row) { if (row == n) { results.add(constructResult(queen)); return; } for (int j = 0; j < n; ++j) { if (column[j] == 0 && mainDiag[row + j] == 0 && antiDiag[row + n - j] == 0) { column[j] = mainDiag[row + j] = antiDiag[row + n - j] = 1; queen[row] = j; dfs(row + 1); column[j] = mainDiag[row + j] = antiDiag[row + n - j] = 0; } } } private String[] constructResult(int[] queen) { String[] array = new String[n]; StringBuilder sb = new StringBuilder(); for (int i = 0; i < n; ++i) { sb.append(‘.‘); } for (int i = 0; i < n; ++i) { sb.setCharAt(queen[i], ‘Q‘); array[i] = sb.toString(); sb.setCharAt(queen[i], ‘.‘); } return array; } }
LeetCode | N-Queens,布布扣,bubuko.com
原文:http://blog.csdn.net/perfect8886/article/details/22203555