# LeetCode 50 N-Queens

120 篇文章 0 订阅

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.."]
]

public class Solution {
public List<String[]> solveNQueens(int n) {
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();
}
} else {
for (int j = 0; j < n; j++) {
if (isValid(list)) {
search(result, n, list, col + 1);
}
list.remove(list.size() - 1);
}
}
}
}

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++;
}
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();
}
}
}

public List<String[]> solveNQueens(int n) {
upperlim = (1 << n) - 1;
search(0, 0, 0, new LinkedList<Integer>(), result);
return result;
}
}

• 0
点赞
• 0
收藏
觉得还不错? 一键收藏
• 0
评论
04-09 171
04-09 145
03-07 111
10-08 100
01-11 236
04-14 750
04-15 420
04-15 516
04-13 339
04-14 317
04-16 395

### “相关推荐”对你有帮助么？

• 非常没帮助
• 没帮助
• 一般
• 有帮助
• 非常有帮助

1.余额是钱包充值的虚拟货币，按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载，可以购买VIP、付费专栏及课程。