// 主函数,负责初始化棋盘并调用回溯算法 public List<List<String>> solveNQueens(int n) { // 定义棋盘,char数组,用 '.' 表示空位 char[][] chessboard = newchar[n][n]; // 初始化棋盘,每个位置都填充为 '.' for (inti=0; i < n; i++) { for (intj=0; j < n; j++) { chessboard[i][j] = '.'; } } backtracking(chessboard, n, 0);// 开始回溯算法,从第0行开始放置皇后 return result;// 返回所有可能的解法 }
// 回溯函数,递归尝试每一行的不同列位置放置皇后 publicvoidbacktracking(char[][] chessboard, int n, int depth) { // 如果当前路径长度等于n,说明已经找到一个解法,加入结果集中 if (path.size() == n) { result.add(newArrayList<>(path)); // 将当前路径加入到结果中 return; // 回溯终止条件 }
// 尝试在当前行(depth)每一列放置皇后 for (intcol=0; col < n; col++) { // 如果当前位置放置皇后合法 if (isValid(chessboard, n, depth, col)) { // 构建当前行的字符串表示,并在指定列放置 'Q' StringBuildersb=newStringBuilder(); for (intj=0; j < n; j++) sb.append("."); // 初始化为全是空位 '.' sb.replace(col, col + 1, "Q"); // 在col列位置放置皇后 'Q' path.add(sb.toString());// 将当前行加入路径 chessboard[depth][col] = 'Q';// 在棋盘上放置皇后 backtracking(chessboard, n, depth + 1);// 递归放置下一行的皇后 chessboard[depth][col] = '.';// 回溯,移除当前行的皇后 // 回溯,移除当前行的字符串布局 path.remove(path.size() - 1); // 使用 path.removeLast() 会出错,因为 List 不支持这个方法 } } }
// 判断在棋盘的(row, col)位置放置皇后是否合法 publicbooleanisValid(char[][] chessboard, int n, int row, int col) { // 判断当前列是否有其他皇后 for (inti=0; i < row; i++) { if (chessboard[i][col] == 'Q') returnfalse; // 当前列已经有皇后,放置非法 }
// 判断135度对角线(左上到右下)是否有其他皇后 for (inti= row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { if (chessboard[i][j] == 'Q') returnfalse; // 135度对角线上已经有皇后 }
// 判断45度对角线(右上到左下)是否有其他皇后 for (inti= row - 1, j = col + 1; i >= 0 && j < n; i--, j++) { if (chessboard[i][j] == 'Q') returnfalse; // 45度对角线上已经有皇后 } // 没有冲突,放置合法 returntrue; } }
// 判断在棋盘 (row, col) 位置放置皇后是否合法 publicbooleanisValid(char[][] chessboard, int n, int row, int col) { // 判断当前列是否有其他皇后 for (inti=0; i < row; i++) { if (chessboard[i][col] == 'Q') returnfalse; // 同列有冲突 }
// 判断135度对角线(左上到右下)是否有皇后 for (inti= row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) { if (chessboard[i][j] == 'Q') returnfalse; // 135度对角线上有冲突 }
// 判断45度对角线(右上到左下)是否有皇后 for (inti= row - 1, j = col + 1; i >= 0 && j < n; i--, j++) { if (chessboard[i][j] == 'Q') returnfalse; // 45度对角线上有冲突 } // 没有冲突,放置合法 returntrue; } }