GO实现奇数阶幻方输出

GO实现奇数阶幻方输出

GO实现奇数阶幻方输出

什么是幻方?

幻方是最古老也是最流行的数学游戏之一。一个n阶幻方是由整数1,2,3,…,n2,按照下述方式组成的n阶方阵:该方阵每行上的整数和、每列上的整数和、主对角线上的整数和、副对角线上的整数和都相等。在此,我们现在仅讨论n为奇数时的幻方的构造方法:
在17世纪,de la Loubere发现了n为奇数时的一种幻方的构造方法。规则如下:

  1. 把1放在第一行的中间位置
  2. 按照自然数的顺序,沿着自左下至右上的对角线放置整数
  3. 在到达顶行时,下一个数放置在底行对应的位置
  4. 到达右边一列时,下一个数放在最左边一列的对应位置
  5. 当要放置的位置已有元素时,下一个元素就放在上一个元素的下方

下面,我们按照上述规则,来手动构造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
}

运行截图如下所示:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值