1. 程式人生 > >還記得八皇后的解法嗎

還記得八皇后的解法嗎

// 4皇后
package main

import (
    "fmt"
)

func main() {

    // 定義4個皇后,初始化座標為[-1,-1],即未放置於棋格中。
    var (
        queen1 = [2]int{-1, -1}
        queen2 = [2]int{-1, -1}
        queen3 = [2]int{-1, -1}
        queen4 = [2]int{-1, -1}
    )

    // 放置第1個皇后
    for i := 0; i < 4; i++ { // 遍歷棋盤上的第一行方格(rank1)
queen1[0] = i queen1[1] = 0 // 更新第2行棋格狀態(此時已放置1個皇后) rank2 := render(queen1) // 放置第2個皇后 for i := 0; i < 4; i++ { if !rank2[i] { queen2[0] = i queen2[1] = 1 // 更新第3行棋格狀態(此時已放置2個皇后) rank3 := render(queen1, queen2)
// 放置第3個皇后 for i := 0; i < 4; i++ { if !rank3[i] { queen3[0] = i queen3[1] = 2 // 更新第4行棋格狀態(此時已放置3個皇后) rank4 := render(queen1, queen2, queen3) // 放置第4個皇后
for i := 0; i < 4; i++ { if !rank4[i] { queen4[0] = i queen4[1] = 3 // 到此,4個皇后均成功置於棋盤中 fmt.Println("solution:", queen1, queen2, queen3, queen4) } } } } } } } } // 根據已放置的皇后,更新下一行棋格的狀態 // 返回一個含4個bool型別元素的陣列,true表示受攻擊的,false表示未受攻擊。 func render(queens ...[2]int) [4]bool { // 國際象棋棋盤中的一行,在英文中叫做:rank var rank [4]bool // 獲取已放置的皇后的數量,可以得到下一行的索引 y := len(queens) // 遍歷下一行的棋格 for x := 0; x < 4; x++ { for _, queen := range queens { // 通過已放置的皇后的棋格座標來判斷攻擊範圍 if x-queen[0] == y-queen[1] || // 正斜攻擊 x == queen[0] || // 縱向攻擊 x+y == queen[0]+queen[1] { // 反斜攻擊 rank[x] = true // 一旦判斷出該棋格受到攻擊,則不用再計算後面的皇后對其影響 break } } } return rank }