c++ - 我的构造奇数幻方的代码不起作用
问题描述
我正在尝试通过连体方法构造奇数幻方
这是我的代码
#include <iostream>
#include <cstring>
using namespace std;
int main(){
int N; cin >> N;
int magicsquares[N][N];
memset(magicsquares, 0, sizeof(magicsquares));
int i = 0, j = N/2;
int num = 1;
while (num <= N*N){
if (magicsquares[i][j] == 0){
magicsquares[i][j] = num++;
i = (i-1+N) % N;
j = (j+1) % N;
} else{
i = (i+2) % N;
j = (j-1+N) % N;
magicsquares[i][j] = num++;
}
}
for (int a = 0; a < N; a++){
for (int b = 0; b < N; b++)
cout << magicsquares[a][b] << " ";
cout << endl;
}
return 0;
}
当我输入 3 时,我预计它会是这样的:
8 1 6
3 5 7
4 9 2
但结果是这样的:
0 9 0
3 0 8
7 0 2
我的代码有什么问题?我想不通
解决方案
在if
分支(未填充的正方形)中,填充一个正方形,然后设置i
并j
指向下一个要填充的正方形。当你遇到一个填充的正方形(else
分支)时,你会按照算法反转和向下的变化,i
并j
填充它。但在那之后,你并没有像在分支中那样i
进行j
下一步的设置。if
设置i
并且j
应该在两个分支中都有。这应该有效:
if (magicsquares[i][j] == 0){
magicsquares[i][j] = num++;
} else{
i = (i+2) % N;
j = (j-1+N) % N;
magicsquares[i][j] = num++;
}
i = (i-1+N) % N; /* Setting up i and j for next fill */
j = (j+1) % N; /* This should be done in both cases */
推荐阅读
- javascript - 如何从 selectedOption 中获取值并显示它
- ruby-on-rails - 根据另一个活动记录属性排除活动记录条目
- php - 通过多维关联数组的值获取键的最快方法
- java - Vaadin - 如何从 bean 项目容器中 bean 项目的对象 id 获取 bean 本身
- python - 使用 openpyxl 无法创建 XLSX
- docker - 如何正确地将 COM 端口暴露给容器?
- python - 如何在不更改类型的情况下连接日期时间数组?
- html - 如何在 div 的右侧和左侧获得 2 个褪色边框(使用引导网格)
- javascript - 已解决:使用自定义输入组件时 React-day-picker Daypicker Input 失去焦点
- c# - 每当我运行我的 c# 应用程序时,都会获取 ScriptedSandbox64.exe_190926_123150 和 Microsoft.VsHub.Server.HttpHostx64.exe_190926_123132 转储文件