题目链接:Magic Odd Square
题目大意:给你一个奇数N,构造一个 n ∗ n n*n n∗n的矩阵并填上 1 − N ∗ N 1 - N*N 1−N∗N这些数字,使得每一行,每一列,主对角线,副对角线和都是奇数。
思路
罗伯特法构造奇数阶幻方
因为N为奇数, 设 N = 2 ∗ k + 1 ( k 为 自 然 数 ) , 其 幻 和 为 N ∗ ( N 2 + 1 ) / 2 , 即 : ( 2 ∗ k + 1 ) ∗ ( 2 ∗ k 2 + 2 k + 1 ) 。 显 然 , 奇 数 ∗ 奇 数 = 奇 数 设N=2*k+1(k为自然数),其幻和为N*(N^2+1)/2,即: (2*k+1)*(2*k^2+2k+1)。显然,奇数*奇数=奇数 设N=2∗k+1(k为自然数),其幻和为N∗(N2+1)/2,即:(2∗k+1)∗(2∗k2+2k+1)。显然,奇数∗奇数=奇数。答案出来了。
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = (int)5e1+5;
int img[maxn][maxn];
void Solve(int n) {
int x,y,goal = n*n;
x = 0;
y = n/2;
memset(img, 0, sizeof(img));
for (int i = 1; i <= goal; i++) {
if (img[x][y] != 0) {
x += 2;
y--;
x %= n;
y = (y+n)%n;
}
img[x][y] = i;
x--;
y++;
x = (x+n)%n;
y %= n;
}
}
int main() {
int n;
cin >> n;
Solve(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d%c", img[i][j], " \n"[j==n-1]);
}
}
return 0;
}