// 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 }
还记得八皇后的解法吗 (4)
内容版权声明:除非注明,否则皆为本站原创文章。