classSolution{List<List<String>> res =newArrayList<>();publicList<List<String>>solveNQueens(int n){//chess表示棋盘,.表示空的,Q表示为皇后char[][] chess =newchar[n][n];for(char[] c : chess){Arrays.fill(c,'.');}//假设从第一行开始backtrack(chess,0);return res;}privatevoidbacktrack(char[][] board,int row){//此时某一行已经找到了一个解if(row == board.length){
res.add(charToList(board));return;}//求出每一列的长度int n = board[row].length;//先假定每一列都可以放皇后for(int col =0; col < n; col++){//将可以互相攻击的皇后排除if(!isValid(board, row, col)){continue;}//在当前位置放置皇后
board[row][col]='Q';//对下一行进行皇后放置选择backtrack(board, row +1);//撤销,即:进行回溯
board[row][col]='.';}}//判断能否在该位置放置皇后,//因为当前位置放入了,只需要关注的是列方向、右上、左上三个位置privatebooleanisValid(char[][] board,int row,int col){int n = board.length;//检查列的方向是否有皇后冲突for(int i =0; i < n; i++){if(board[i][col]=='Q'){returnfalse;}}//检查右上方是否有冲突for(int i = row -1, j = col +1; i >=0&& j < n; i--, j++){if(board[i][j]=='Q'){returnfalse;}}//检查左上是否有冲突for(int i = row -1, j = col -1; i >=0&& j >=0; i--, j--){if(board[i][j]=='Q'){returnfalse;}}//都没有returntrue;}//将棋盘转换为listprivateListcharToList(char[][] board){List<String> list =newArrayList<>();for(char[] c : board){
list.add(String.copyValueOf(c));}return list;}}
文章目录N皇后N皇后视频推荐思路:先把题目解释一下就是,在某个位置放入皇后之后,该位置的上下左右,左右斜上斜下的位置都不能再放入皇后了。是一个经典回溯问题。可以看一下代码注释,解释的比较详细了。代码:class Solution { List<List<String>> res = new ArrayList<>(); public List<List<String>> solveNQueens(int