用java语言实现,采用回溯法解决n皇后问题
时间: 2024-05-06 22:15:54 浏览: 78
好的,下面是用Java语言实现n皇后问题的回溯法解决方案:
```java
public class NQueens {
public static void main(String[] args) {
int n = 8; // n表示棋盘大小和皇后个数
int[] queens = new int[n]; // queens数组表示每行皇后所在的列数,初始化为0
boolean[] cols = new boolean[n]; // cols数组表示每列是否已经有皇后,初始化为false
boolean[] dia1 = new boolean[2 * n - 1]; // dia1数组表示主对角线上是否有皇后,初始化为false
boolean[] dia2 = new boolean[2 * n - 1]; // dia2数组表示副对角线上是否有皇后,初始化为false
List<List<String>> res = new ArrayList<>(); // res用于存储所有合法的解
backtrack(n, queens, cols, dia1, dia2, 0, res); // 调用回溯函数
// 输出所有解
for (List<String> list : res) {
for (String str : list) {
System.out.println(str);
}
System.out.println();
}
}
/**
* 回溯函数
*
* @param n 棋盘大小和皇后个数
* @param queens queens数组表示每行皇后所在的列数
* @param cols cols数组表示每列是否已经有皇后
* @param dia1 dia1数组表示主对角线上是否有皇后
* @param dia2 dia2数组表示副对角线上是否有皇后
* @param row 当前处理的行数
* @param res 用于存储所有合法的解
*/
private static void backtrack(int n, int[] queens, boolean[] cols, boolean[] dia1, boolean[] dia2, int row, List<List<String>> res) {
if (row == n) { // 如果已经处理完了所有的行,说明当前方案合法,将其加入res中
List<String> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
char[] chars = new char[n];
Arrays.fill(chars, '.');
chars[queens[i]] = 'Q';
list.add(new String(chars));
}
res.add(list);
return;
}
for (int col = 0; col < n; col++) { // 遍历当前行的所有列
if (!cols[col] && !dia1[row - col + n - 1] && !dia2[row + col]) { // 如果当前列、主对角线、副对角线都没有皇后,则可以在当前位置放置皇后
queens[row] = col; // 在当前位置放置皇后
cols[col] = true; // 标记当前列已经有皇后
dia1[row - col + n - 1] = true; // 标记当前位置所在的主对角线上已经有皇后
dia2[row + col] = true; // 标记当前位置所在的副对角线上已经有皇后
backtrack(n, queens, cols, dia1, dia2, row + 1, res); // 处理下一行
queens[row] = 0; // 回溯
cols[col] = false; // 回溯
dia1[row - col + n - 1] = false; // 回溯
dia2[row + col] = false; // 回溯
}
}
}
}
```
这段代码中,backtrack函数用于递归地搜索所有可能的解,其参数分别为棋盘大小n、queens数组、cols数组、dia1数组、dia2数组、当前处理的行数row和用于存储所有合法的解的res列表。在每一行中,我们遍历当前行的所有列,如果当前列、主对角线、副对角线都没有皇后,则可以在当前位置放置皇后,并标记当前列、主对角线、副对角线上已经有皇后。然后递归地处理下一行,直到处理完所有行。如果已经处理完了所有的行,说明当前方案合法,将其加入res中。最后,输出所有合法的解。
注意:这段代码中的n取值最好不要超过12,因为n越大,搜索空间就越大,程序运行时间就会越长。如果要处理更大的n,可以考虑使用其他算法或优化算法的实现。
阅读全文