一、 问题描述
N皇后问题是一个经典的回溯算法问题,要求在一个N×N的棋盘上放置N个皇后,使得它们互相之间不会攻击到对方。皇后的攻击范围包括同一行、同一列和同一条对角线。
二、算法思想
解决这个问题的一种常见方法是使用递归和回溯的思想。可以从第一行开始,逐行放置皇后,并使用一个数组来记录每一行皇后所在的列。当放置到第i行时,遍历该行的每一列,检查是否符合条件,如果符合则继续递归放置下一行的皇后,否则回溯到上一行继续尝试其他列的位置。
三、代码实现
解决N皇后问题的java代码如下:
public class NQueens {
private int[] queens; // 存储皇后所在列的索引
private int n; // 棋盘大小
public NQueens(int n) {
this.n = n;
this.queens = new int[n];
}
public void solve() {
if (placeQueens(0)) {
printQueens();
} else {
System.out.println("无解");
}
}
private boolean placeQueens(int row) {
if (row == n) {
return true; // 所有皇后都放置完成
}
for (int col = 0; col < n; col++) {
if (isValid(row, col)) {
queens[row] = col; // 在当前行的合法位置放置皇后
// 递归放置下一行的皇后
if (placeQueens(row + 1)) {
return true;
}
}
}
return false; // 无法在当前行放置皇后
}
private boolean isValid(int row, int col) {
// 检查当前位置是否与已经放置的皇后冲突
for (int i = 0; i < row; i++) {
if (queens[i] == col || queens[i] - col == i - row || queens[i] - col == row - i) {
return false;
}
}
return true;
}
private void printQueens() {
// 打印皇后的位置
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (queens[i] == j) {
System.out.print("Q ");
} else {
System.out.print(". ");
}
}
System.out.println();
}
}
public static void main(String[] args) {
int n = 8; // 棋盘大小
NQueens nQueens = new NQueens(n);
nQueens.solve();
}
}
代码评价
以上代码中,backtrack函数用于递归放置皇后,is_valid函数用于检查当前位置是否符合条件。程序最终返回一个List,其中每个元素是一个解决方案,每个解决方案是一个N×N的棋盘,其中Q代表皇后,.代表空白位置。
执行结果
结语
有了想法就去践行,不要怕出错
没什么大不了的,大不了重头再来过
!!!