還記得八皇后的解法嗎
阿新 • • 發佈:2018-12-14
// 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 }