用JAVA语言写概率算法求解八皇后问题。要求如下步骤:1.有算法思路。2.代码思路,3.程序框图。4.伪代码 。5.代码实现,并且代码中要有重点注释,伪代码和用JAVA语言写的代码之间要相互对应。
时间: 2023-06-16 21:06:09 浏览: 82
八皇后问题,Java语言编写
5星 · 资源好评率100%
算思路:
1. 定义一个数组,记录每行皇后所在的列号,初始值为-1。
2. 从第一行开始,逐行放置皇后。
3. 对于每一行,依次将皇后放置于该行的每一列上,检查是否与之前的皇后冲突。
4. 如果冲突,则尝试放置到下一列。
5. 如果所有列都尝试过,但仍然冲突,则回溯到上一行,重新尝试。
6. 如果所有行都尝试过,且所有皇后都没有冲突,则找到了一组解。
代码思路:
1. 定义一个数组board,记录每行皇后所在的列号,初始值为-1。
2. 定义一个方法solveNQueens(int row),用于放置第row行的皇后。
3. 在solveNQueens方法中,依次尝试将皇后放置到该行的每一列上,并检查是否与之前的皇后冲突。
4. 如果冲突,则尝试放置到下一列。
5. 如果所有列都尝试过,但仍然冲突,则回溯到上一行,重新尝试。
6. 如果所有行都尝试过,且所有皇后都没有冲突,则找到了一组解。
7. 在main方法中调用solveNQueens方法,并输出解的数量。
程序框图:
```
start
|
|——> main()
| |
| |——> solveNQueens(0)
| |
| |——> tryQueen(row, col)
| |
| |——> isConflict(row, col)
| |
| |——> solveNQueens(row + 1)
| |
| |——> printBoard()
| |
| |——> count++
| |——> board[row] = -1
| |
| |——> return
|
|——> end
```
伪代码:
```
board = new int[8] // 初始值为-1
count = 0
solveNQueens(row):
if row == 8:
printBoard()
count++
return
for col in 0 to 7:
if isConflict(row, col):
continue
board[row] = col
solveNQueens(row + 1)
board[row] = -1
isConflict(row, col):
for i in 0 to row - 1:
if board[i] == col or abs(board[i] - col) == abs(i - row):
return true
return false
printBoard():
for i in 0 to 7:
for j in 0 to 7:
if board[i] == j:
print("Q ")
else:
print(". ")
println()
main():
solveNQueens(0)
println("Total solutions: " + count)
```
代码实现:
```
public class EightQueens {
private int[] board = new int[8];
private int count = 0;
public static void main(String[] args) {
EightQueens eq = new EightQueens();
eq.solveNQueens(0);
System.out.println("Total solutions: " + eq.count);
}
private void solveNQueens(int row) {
if (row == 8) {
printBoard();
count++;
return;
}
for (int col = 0; col < 8; col++) {
if (isConflict(row, col)) {
continue;
}
board[row] = col;
solveNQueens(row + 1);
board[row] = -1;
}
}
private boolean isConflict(int row, int col) {
for (int i = 0; i < row; i++) {
if (board[i] == col || Math.abs(board[i] - col) == Math.abs(i - row)) {
return true;
}
}
return false;
}
private void printBoard() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (board[i] == j) {
System.out.print("Q ");
} else {
System.out.print(". ");
}
}
System.out.println();
}
System.out.println();
}
}
```
代码中的注释:
```java
public class EightQueens {
private int[] board = new int[8]; // 存放每行皇后所在的列号,初始值为-1
private int count = 0; // 统计解的数量
public static void main(String[] args) {
EightQueens eq = new EightQueens();
eq.solveNQueens(0); // 从第0行开始放置皇后
System.out.println("Total solutions: " + eq.count);
}
private void solveNQueens(int row) {
if (row == 8) { // 找到一组解
printBoard(); // 输出棋盘
count++; // 解的数量加1
return;
}
for (int col = 0; col < 8; col++) { // 逐列尝试放置皇后
if (isConflict(row, col)) { // 如果冲突了,尝试下一列
continue;
}
board[row] = col; // 放置皇后
solveNQueens(row + 1); // 放置下一行皇后
board[row] = -1; // 回溯,清空该行皇后位置
}
}
private boolean isConflict(int row, int col) {
for (int i = 0; i < row; i++) { // 逐行检查
if (board[i] == col || Math.abs(board[i] - col) == Math.abs(i - row)) { // 在同一列或同一对角线上
return true; // 冲突了
}
}
return false; // 没有冲突
}
private void printBoard() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (board[i] == j) { // 该位置有皇后
System.out.print("Q ");
} else { // 该位置没有皇后
System.out.print(". ");
}
}
System.out.println();
}
System.out.println();
}
}
```
阅读全文