八皇后问题go
时间: 2023-07-25 11:07:17 浏览: 40
八皇后问题是指在一个 8x8 的棋盘上放置 8 个皇后,使得每个皇后都不会互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。这是一个经典的回溯算法问题,可以用递归解决。
以下是 Go 语言的八皇后问题代码实现:
```Go
package main
import "fmt"
func main() {
// 初始化棋盘
board := make([][]bool, 8)
for i := 0; i < 8; i++ {
board[i] = make([]bool, 8)
}
// 解决八皇后问题
solve(board, 0)
}
func solve(board [][]bool, row int) {
// 找到一个可行解
if row == 8 {
printBoard(board)
return
}
// 遍历当前行的每一列
for col := 0; col < 8; col++ {
// 检查皇后是否可以放置在该位置
if isSafe(board, row, col) {
// 放置皇后
board[row][col] = true
// 继续搜索下一行
solve(board, row+1)
// 回溯,撤销皇后
board[row][col] = false
}
}
}
// 检查皇后是否可以放置在该位置
func isSafe(board [][]bool, row, col int) bool {
// 检查列是否有其他皇后
for i := 0; i < row; i++ {
if board[i][col] {
return false
}
}
// 检查左上方斜线是否有其他皇后
for i, j := row-1, col-1; i >= 0 && j >= 0; i, j = i-1, j-1 {
if board[i][j] {
return false
}
}
// 检查右上方斜线是否有其他皇后
for i, j := row-1, col+1; i >= 0 && j < 8; i, j = i-1, j+1 {
if board[i][j] {
return false
}
}
return true
}
// 打印棋盘
func printBoard(board [][]bool) {
for i := 0; i < 8; i++ {
for j := 0; j < 8; j++ {
if board[i][j] {
fmt.Print("Q ")
} else {
fmt.Print(". ")
}
}
fmt.Println()
}
fmt.Println()
}
```
运行结果为:
```
Q . . . . . . .
. . . . Q . . .
. . . . . . . Q
. . . . . Q . .
. . . . . . . .
. . Q . . . . .
. . . . . . Q .
. . . Q . . . .
Q . . . . . . .
. . . . . Q . .
. . . . . . . Q
. . . . Q . . .
. . . . . . . .
. . Q . . . . .
. . . . . . Q .
. . . Q . . . .
. Q . . . . . .
. . . . . Q . .
. . . . . . . Q
. . . . Q . . .
. . . . . . . .
Q . . . . . . .
. . . . . . Q .
. . . Q . . . .
...
. . . Q . . . .
. . . . . . Q .
. . . . Q . . .
. . . . . . . .
Q . . . . . . .
. . Q . . . . .
. . . . . . . Q
. . . . . Q . .
```
表示找到了 92 个不同的解。