GO实现奇数阶幻方输出
GO实现奇数阶幻方输出
什么是幻方?
幻方是最古老也是最流行的数学游戏之一。一个n阶幻方是由整数1,2,3,…,n2,按照下述方式组成的n阶方阵:该方阵每行上的整数和、每列上的整数和、主对角线上的整数和、副对角线上的整数和都相等。在此,我们现在仅讨论n为奇数时的幻方的构造方法:
在17世纪,de la Loubere发现了n为奇数时的一种幻方的构造方法。规则如下:
- 把1放在第一行的中间位置
- 按照自然数的顺序,沿着自左下至右上的对角线放置整数
- 在到达顶行时,下一个数放置在底行对应的位置
- 到达右边一列时,下一个数放在最左边一列的对应位置
- 当要放置的位置已有元素时,下一个元素就放在上一个元素的下方
下面,我们按照上述规则,来手动构造n为3时的幻方。
下面,我们尝试用GO语言代码来实现上述规则
package main
import "fmt"
type storeCoord struct {
x int // 行
y int // 列
}
type matrix [][]int
func main() {
var n int
fmt.Printf("请输入幻方的阶数:")
fmt.Scanln(&n)
if n%2 == 0 {
fmt.Println("请输入奇数!")
return
}
hfSlice := constructMatrix(n, n)
var sc storeCoord // 存储位置
for i := 1; i <= n*n; i++ {
if i == 1 {
sc.x = 0
sc.y = (n - 1) / 2
} else {
if sc.x-1 < 0 {
if sc.y == n-1 || hfSlice[n-1][sc.y+1] != 0 { // 先判断sc.y,防止数组越界
sc.x = sc.x + 1
} else {
sc.x = n - 1
sc.y = sc.y + 1
}
} else if sc.y+1 > n-1 {
if hfSlice[sc.x-1][0] != 0 {
sc.x = sc.x + 1
} else {
sc.x = sc.x - 1
sc.y = 0
}
} else {
if hfSlice[sc.x-1][sc.y+1] != 0 {
sc.x = sc.x + 1
} else {
sc.x = sc.x - 1
sc.y = sc.y + 1
}
}
}
hfSlice[sc.x][sc.y] = i
}
for i := range hfSlice {
for j := range hfSlice[i] {
fmt.Printf("%d ", hfSlice[i][j])
}
fmt.Printf("\n")
}
}
func constructMatrix(rows, cols int) matrix { // 构造一个rows行、cols列的二维数组切片
m := make([][]int, rows)
for i := 0; i < rows; i++ {
m[i] = make([]int, cols)
}
return m
}
运行截图如下所示: