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.."] ]
思路:回溯法,使用ArrayList<Integer> al来存储某个皇后的列,而它在ArrayList的索引就是其行数。
public class Solution {
public List<String[]> solveNQueens(int n) {
List<String[]> result = new LinkedList<String[]>();
search(result, n, new ArrayList<Integer>(), 1);
return result;
}
private boolean isValid(List<Integer> list) {
int column = list.get(list.size() - 1);
for (int i = 0; i < list.size() - 1; i++) {
if (column == list.get(i)
|| Math.abs(column - list.get(i)) == Math.abs(list.size() - 1
- i)) {
return false;
}
}
return true;
}
private void search(List<String[]> result, int n, List<Integer> list,
int col) {
if (col > n) {
char[] temp = new char[n];
Arrays.fill(temp, '.');
String[] str = new String[n];
for (int i = 0; i < list.size(); i++) {
StringBuilder sb = new StringBuilder(String.valueOf(temp));
sb.setCharAt(list.get(i), 'Q');
str[i] = sb.toString();
}
result.add(str);
} else {
for (int j = 0; j < n; j++) {
list.add(j);
if (isValid(list)) {
search(result, n, list, col + 1);
}
list.remove(list.size() - 1);
}
}
}
}
思路2:回溯法,只不过使用了位移操作,更快,剪枝剪得更厉害,详细分析见
http://blog.csdn.net/mlweixiao/article/details/40984589
public class Solution {
static int upperlim = 1;
private void search(int l, int ld, int rd, List<Integer> list,
List<String[]> result) {
if (l != upperlim) {
int pos = upperlim & (~(l | ld | rd));
while (pos != 0) {
int p = pos & -pos;
int temp = p;
int index = 0;
while (temp != 1) {
temp = temp >> 1;
index++;
}
list.add(index);// 从0开始的
pos ^= p;
search(l | p, (ld | p) << 1, (rd | p) >> 1, list, result);
list.remove(list.size() - 1);
}
} else {
char[] temp = new char[list.size()];
Arrays.fill(temp, '.');
String[] str = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
StringBuilder sb = new StringBuilder(String.valueOf(temp));
sb.setCharAt(list.get(i), 'Q');
str[i] = sb.toString();
}
result.add(str);
}
}
public List<String[]> solveNQueens(int n) {
upperlim = (1 << n) - 1;
List<String[]> result = new LinkedList<String[]>();
search(0, 0, 0, new LinkedList<Integer>(), result);
return result;
}
}