八皇后相杀问题
code(golang)
共有92中排列方法(递归实现)
package main
import (
"fmt"
)
var (
count = 0
)
func notDanger(row, column int, chess *[8][8]int) bool {
var (
i, k int
flag1 int
flag2 int
flag3 int
flag4 int
flag5 int
)
// 判断列➡️方向
for i := 0; i < 8; i++ {
if chess[i][column] != 0 {
flag1 = 1
break
}
}
// 判断⬅️⤴️左上方 OK
i = row
k = column
for i >= 0 && k >= 0 {
if chess[i][k] != 0 {
flag2 = 1
break
}
i--
k--
}
// 判断➡️⬇️方 右下方 ok
i = row
k = column
for i > 8 && k > 8 {
if chess[i][k] != 0 {
flag3 = 1
break
}
i++
k++
}
// 判断➡️⬆️右上方
i = row
k = column
for i >= 0 && k < 8 {
if chess[i][k] != 0 {
flag4 = 1
break
}
i--
k++
}
// 判断⬅️⬇️左下方
i = row
k = column
for i < 8 && k >= 0 {
if chess[i][k] != 0 {
flag5 = 1
break
}
i++
k--
}
if flag1 == 1 || flag2 == 1 || flag3 == 1 || flag4 == 1 || flag5 == 1 {
return false
}
return true
}
func PrintChess(chess *[8][8]int) {
for i := 0; i < 8; i++ {
for j := 0; j < 8; j++ {
fmt.Printf("%d ", chess[i][j])
}
fmt.Printf("\n")
}
fmt.Printf("\n")
}
// EightQueen ...
// row 表示起始行
// n 表示列
// chess *[8]int 表示指向棋盘每一行的指针
func EightQueen(row, column int, chess *[8][8]int) {
tmpChess := [8][8]int{}
for i := 0; i < 8; i++ {
for j := 0; j < 8; j++ {
tmpChess[i][j] = chess[i][j]
}
}
// 递归核心
if row == 8 {
fmt.Printf("第 %d 种\n", count)
PrintChess(&tmpChess)
fmt.Printf("\n")
count++
} else {
// 这个位置是否有危险
// 如果没有危险就继续往下
for j := 0; j < column; j++ {
// fmt.Printf("第%d列,第%d行\n", row, j)
if notDanger(row, j, chess) { // 是否危险
for i := 0; i < 8; i++ {
tmpChess[row][i] = 0
}
tmpChess[row][j] = 1
EightQueen(row+1, column, &tmpChess)
}
}
}
}
func main() {
var chess [8][8]int
EightQueen(0, 8, &chess)
fmt.Printf("总共有 %d 解决方法\n", count)
}