三阶幻方数字位置确定方法及对应C++代码逻辑咨询
3阶幻方生成代码逻辑解析
你提供的这段代码采用的是奇数阶幻方的通用构造方法罗伯法(楼梯法),数字位置的确定逻辑完全符合该方法的规则,你疑惑的测试位置段是该方法的核心实现。
罗伯法基础规则
- 数字1放在第一行的正中间位置
- 后续每个数字默认放在上一个数字的左上角相邻位置:即行索引减1,列索引减1
- 若左上角位置超出网格边界,就循环绕到对侧边界:行越过上边界就落到最后一行,列越过左边界就落到最后一列
- 若左上角位置已经填过数字,就改为放到上一个数字的正下方相邻位置,越界同样循环绕回对侧边界
代码对应逻辑说明
初始化部分
int row = 0; // 行起始位置,对应第一行 int col = 3 / 2; // 列起始位置,3阶的正中间列索引为1 for ( i = 0; i < 3 ; i++ ) { for ( j = 0 ; j < 3; j++ ) magicsq[i][j] = 0; // 0代表位置未被填充 } magicsq[row][col] = 1; // 按照规则放置第一个数字1
你询问的测试位置核心段
for ( x = 2; x <= 3 * 3; x++ ) { int r = row - 1, c = col - 1; // 测试位置:先试探上一个数的左上角 if (r < 0) r += 3; // 行越过上边界,绕回最后一行 if (c < 0) c += 3; // 列越过左边界,绕回最后一列 if ( magicsq[r][c]>0) { // 试探的左上角位置已被填充 row++; // 改为走到上一个数的正下方 if ( row >= 3 ) row -= 3; // 行越过下边界,绕回第一行 } else { row = r; // 试探位置可用,更新坐标为试探位置 col = c; } magicsq[row][col] = x; // 填充当前数字 }
输出部分
遍历生成好的3阶幻方逐行打印,最终输出的结果是标准的3阶幻方:
8 1 6 3 5 7 4 9 2
内容的提问来源于stack exchange,提问作者Karl Abechuela
相关产品推荐
相关产品推荐

