N-Queens
问题简介:给定一个n*n的棋盘,求解如何将n个皇后放置在棋盘上, 保证其之间不互相攻击,即给定一个整数 n,返回所有不同的解决方案,用 ‘Q’ 和 ‘.’ 分别代表了皇后和空位
注:例如下图为n = 8 时的一个解
举例:
输入: 4
输出: [
[".Q…", // Solution 1
“…Q”,
“Q…”,
“…Q.”],
["…Q.", // Solution 2
“Q…”,
“…Q”,
“.Q…”]
]
解法一:
利用递归,首先从第一行元素开始,逐行扫描判断,主要的关注点在于判断Q值的同列,斜向上是否有Q值,这里赋予值1代表’Q’值及’.'为0,当判断斜向时,从左上到右下的方向上(x - y)值固定,从左下到右上的方向上(x + y)值固定,(x,y即横纵坐标),最后要注意递归时,值的清理
class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> result = new ArrayList<List<String>>();
queens(result, n, 1, new String[n],
new int[n + 1], new int[2 * n + 1], new int[2 * n + 1]);
return result;
}
void queens(List<List<String>> result, int n, int i, String[] lines,
int[] columns, int[] lDown, int[] rDown) {
if (i > n) {
// 数据复制,防止篡改
result.add(new ArrayList<String>(Arrays.asList(lines)) );
return;
}
for (int j = 1; j <= n; j++) {
if (columns[j] == 0 && lDown[i + j] == 0 && rDown[i - j + n] == 0) {
char[] line = new char[n];
Arrays.fill(line, '.');
line[j - 1] = 'Q';
lines[i - 1] = new String(line);
columns[j] = lDown[i + j] = rDown[i - j + n] = 1;
queens(result, n, i + 1, lines, columns, lDown, rDown);
// 数据清理,结构复用
columns[j] = lDown[i + j] = rDown[i - j + n] = 0;
}
}
}
}
小白刷题之路,请多指教— — 要么大器晚成,要么石沉大海