51

为什么下面的内容第一个对,第二个错。???
        // 检查左上方是否有皇后互相冲突
        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;
}

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324092691&siteId=291194637
51
51