八皇后遊戲規則說明:
在8×8格的國際象棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行、同一列或同一斜線上,問有多少種擺法。(百度百科)
延申到n皇后,規則已知,算法的空間複雜度爲O(n^2), 空間複雜度爲O(n),
package main
import "fmt"
//判斷該位置是否滿足八皇后規則
func eJudge(e []int, i int) bool {
for z := 1; z < i; z++ {
if e[z] == e[i] || z-e[z] == i-e[i] || e[z]+z == e[i]+i {
return false
}
}
return true
}
//打印八皇后的位置
func ePrint(e []int) {
fmt.Println("=================")
for _, j := range e {
for z := 0; z < len(e); z++ {
if z == j {
fmt.Printf("1 ");
} else {
fmt.Printf("0 ");
}
}
fmt.Println("")
}
}
//遊戲go
func eight(e []int, i int, cnt *int) {
if i == len(e) {
*cnt += 1
return
}
for j := 1; j < len(e); j++ {
e[i] = j
if eJudge(e, i) {
eight(e, i+1, cnt)
}
e[i] = 0
}
}
//輸入參數
func eightProcess(num int) int {
cnt := new(int)
*cnt = 0
e := make([]int, num+1)
eight(e, 1, cnt)
return *cnt
}
//demo 8x8
func main() {
result := eightProcess(8)
fmt.Println(result)
}