奇数阶幻方C++实现的矩阵移动遍历逻辑问题咨询
奇数阶幻方代码逻辑解释
核心前提:代码的坐标约定和常规认知相反
这段代码里二维数组magq[x][y]的下标定义和你默认的「行在前、列在后」刚好反过来:
x是列索引,y是行索引- 输出幻方时,外层循环遍历
y(逐行输出),内层循环遍历x(每行输出所有列),你认知里的坐标(行号, 列号),在代码里对应的是magq[列号][行号]。
问题1:数字1的位置符合课程要求
课程要求「数字1放在首行中间列」,对应坐标:
- 首行:行索引
y=0 - 中间列:列索引
x=(size-1)/2
刚好就是代码里magq[(size-1)/2][0]的位置,以size=5为例,就是首行(y=0)第三列(x=2),完全符合课程说明,你之前混淆了x、y的含义才觉得位置不对。
问题2:移动规则就是标准罗伯法(楼梯法)
常规奇数阶幻方的填充规则是:
- 新数字放在上一个数字的右上方向,行号减1、列号加1,越界则回绕到对侧边界
- 如果右上位置已经填过数字,新数字就放在上一个数字的正下方,行号加1、列号不变
对应到代码的坐标逻辑:
- 计算右上位置:
- 列加1,越界回绕:
xneu=(x+1)%size - 行减1,越界回绕:
yneu=y>0 ? y-1 : size-1
- 列加1,越界回绕:
- 若右上位置已填充,改为放在正下方:
- 列不变:
xneu=x - 行加1,越界回绕:
yneu=y+1,如果yneu == size就设为0
- 列不变:
以size=5填充z=2的场景举例:
z=1的坐标是x=2(列2)、y=0(行0),计算右上位置得到xneu=3、yneu=4,对应你认知里的坐标是(行4,列3),和你认为应该存储2的位置完全一致,只是你把x、y的顺序搞反了才觉得结果相反。
验证逻辑
代码最后会计算两条对角线的和,和理论值size*(size*size+1)/2对比,你运行代码输入size=5会得到对角线和均为65,符合幻方要求,整体逻辑正确。
内容的提问来源于stack exchange,提问作者imbAF
相关产品推荐
相关产品推荐

