N-Queens
皇后问题
解题思路
使用回溯法解决N皇后问题,是常见的解决方法。分N步放置皇后,由于皇后之间不能同行、同列、同斜线,所以每次放置皇后的时候,都要考虑是否与已有的皇后“冲突”,如果冲突,则改变位置,直至所有皇后放置完毕。
代码
代码解析:设置了三个布尔类型的数组cols、d1、d2分别代表着列,正对角线\、反对角线/;
其中:一、每一条正对角线上的差值都相等,例如(0,1)(1,2)(2,3)、、、因此定义一个[2*n]的数组来对应n维数组矩阵的2n条正对角线;
二、同理,每一条负对角线上的和值都相等,因此定义一个[2*n]的数组来对应n维数组矩阵的2n条负对角线;
(此题回溯法个人认为非常的经典 建议自己多看)
public class Solution {
public List<List<String>> solveNQueens(int n) {
List<List<String>> result = new ArrayList<List<String>>();
helper(result, new ArrayList<String>(), 0, new boolean[n], new boolean[2*n], new boolean[2*n], n);
return result;
}
private void helper(List<List<String>> result, List<String> board, int row, boolean[] cols, boolean[] d1, boolean[] d2, int n){
if (row == n) {
result.add(new ArrayList<String>(board));
}
for (int col=0; col<n; col++){
int id1 = col - row + n;
int id2 = col + row;
if (!cols[col] && !d1[id1] && !d2[id2]){
char[] r = new char[n];
Arrays.fill(r, '.'); //r字符数组中全是‘.’
r[col] = 'Q';
board.add(new String(r)); //只要一行符合条件就加入
cols[col] = true;
d1[id1] = true;
d2[id2] = true;
helper(result, board, row+1, cols, d1, d2, n);
board.remove(board.size()-1);
cols[col] = false;
d1[id1] = false;
d2[id2] = false;
}
}
}
}