为什么下面的内容第一个对,第二个错。???
// 检查左上方是否有皇后互相冲突
for (int i = row - 1, j = col - 1;i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == 'Q')
return false;
}
//左上
for(int i=0,j=0;i<row&&j<col;i++,j++){
if(board[i][j]=='Q'){
return false;
}
}
List<List<String>>res=new ArrayList<>();
public List<List<String>> solveNQueens(int n) {
//二维数组board用来存储皇后的位置
char[][] board=new char[n][n];
//赋初值
for(char[] i:board){
Arrays.fill(i,'.');
}
//调用回溯函数backtrack,按照行
backtrack(board,0);
return res;
}
// 路径:board 中小于 row 的那些行都已经成功放置了皇后
// 选择列表:第 row 行的所有列都是放置皇后的选择
// 结束条件:row 超过 board 的最后一行
public void backtrack(char[][] board,int row){
// 结束条件:row 超过 board 的最后一行
if(row==board.length){
res.add(array2List(board));
return;
}
// 选择列表:第 row 行的所有列都是放置皇后的选择
for(int j=0;j<board.length;j++){
// 选择列表:第 row 行的所有列都是放置皇后的选择
if (!check(board,row,j)){
continue;
}
// 做选择
board[row][j] = 'Q';
// 进入下一行决策
backtrack(board,row+1);
// 撤销选择
board[row][j] = '.';
}
}
//输入二维数组,将其转换为列表
//这里的res是局部变量
//这里得自己深入思考理解:
//答案是[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
//board=[".Q..","...Q","Q...","..Q."],放到list中,是作为一个元素在最上边的:res.add(array2List(board));
public List<String> array2List(char[][] board){
List<String> res = new LinkedList<>();
for (char[] i : board){
StringBuffer sb = new StringBuffer();
for (char j : i){
sb.append(j);
}
res.add(sb.toString());
}
return res;
}
//任何两个皇后都不能处于同一条横行、纵行或斜线上。
boolean check(char[][] board,int row,int col){
int n = board.length;
// 检查列是否有皇后互相冲突
for (int i = 0; i < n; i++) {
if (board[i][col] == 'Q')
return false;
}
// 检查右上方是否有皇后互相冲突
for (int i = row - 1, j = col + 1;
i >= 0 && j < n; i--, j++) {
if (board[i][j] == 'Q')
return false;
}
// 检查左上方是否有皇后互相冲突
for (int i = row - 1, j = col - 1;
i >= 0 && j >= 0; i--, j--) {
if (board[i][j] == 'Q')
return false;
}
return true;
}