(C语言)构造 n n n阶幻方
n
n
n阶幻方分奇、单偶和双偶型。具体可见下面的博客:
https://blog.youkuaiyun.com/html5gz/article/details/4804170
代码:(附赠一个check函数用于检查构造出来的是不是幻方)
#include <stdio.h>
int ans[1005][1005];
void create(int n, int (*square)[n]);
void out(int n, int (*square)[n]);
int check(int n, int (*square)[n]);
void clear(int n, int (*square)[n]);
int main(){
int n;
scanf("%d", &n);
create(n, ans);
out(n, ans);
}
void create(int n,int (*square)[n]){
if(n%2==1){
int i = 0;
int j = (n - 1) / 2;
int ii, jj;
int step = 1;
square[i][j] = step;
while(step<n*n){
ii = (i - 1 + n) % n;
jj = (j + 1) % n;
if(square[ii][jj]==0){
i = ii;
j = jj;
square[i][j] = ++step;
}
else{
i = i + 1;
square[i][j] = ++step;
}
}
}
else{
if(n%4==0){
int i,j;
int step = 1;
for (i = 0; i < n;i++){
for (j = 0; j < n;j++){
square[i][j] = step++;
}
}
int k;
int m = n / 4;
for (k = 0; k < m;k++){
for (i = 0; i < m;i++){
square[4 * k][4 * i] = n * n + 1 - square[4 * k][4 * i];
square[4 * k][4 * i + 3] = n * n + 1 - square[4 * k][4 * i + 3];
square[4 * k + 3][4 * i] = n * n + 1 - square[4 * k + 3][4 * i];
square[4 * k + 3][4 * i + 3] = n * n + 1 - square[4 * k + 3][4 * i + 3];
square[4 * k + 1][4 * i + 1] = n * n + 1 - square[4 * k + 1][4 * i + 1];
square[4 * k + 1][4 * i + 2] = n * n + 1 - square[4 * k + 1][4 * i + 2];
square[4 * k + 2][4 * i + 1] = n * n + 1 - square[4 * k + 2][4 * i + 1];
square[4 * k + 2][4 * i + 2] = n * n + 1 - square[4 * k + 2][4 * i + 2];
}
}
}
else if(n%4==2){
int m = n / 2;
int i,j;
int temp[m][m];
for (i = 0;i < m;i++){
for (j = 0; j < m;j++){
temp[i][j] = 0;
}
}
create(m, temp);
for (i = 0; i < m;i++){
for (j = 0; j < m;j++){
square[i][j] = temp[i][j];
square[i][j + m] = temp[i][j] + 2 * m * m;
square[i + m][j] = temp[i][j] + 3 * m * m;
square[i + m][j + m] = temp[i][j] + m * m;
}
}
int k = (n - 2) / 4;
int mm = (m - 1) / 2;
int t;
for (i = 0; i < mm;i++){
for (j = 0; j < k;j++){
t = square[i][j];
square[i][j] = square[i + m][j];
square[i + m][j] = t;
}
}
for (j = 0; j < k;j++){
t = square[mm][mm + j];
square[mm][mm + j] = square[mm + m][mm + j];
square[mm + m][mm + j] = t;
}
for (i = mm + 1; i < m;i++){
for (j = 0; j < k;j++){
t = square[i][j];
square[i][j] = square[i + m][j];
square[i + m][j] = t;
}
}
for (j = n - mm - 1; j >= n - mm - k + 1;j--){
for (i = 0; i < m;i++){
t = square[i][j];
square[i][j] = square[i + m][j];
square[i + m][j] = t;
}
}
}
}
}
void out(int n, int (*square)[n]){
int i,j;
for (i = 0; i < n;i++){
for (j = 0; j < n;j++){
printf(" %4d", square[i][j]);
}
printf("\n");
}
}
int check(int n,int (*square)[n]){
int s = (n * (n * n + 1)) / 2;
int sum = 0;
int i,j;
for (i = 0; i < n;i++){
sum = 0;
for (j = 0; j < n;j++){
sum += square[i][j];
if(sum>s){
return 0;
}
}
if(sum!=s){
return 0;
}
}
for (j = 0; j < n;j++){
sum = 0;
for (i = 0; i < n;i++){
sum += square[i][j];
if(sum>s){
return 0;
}
}
if(sum!=s){
return 0;
}
}
sum = 0;
i = j = 0;
while(i<n&&j<n){
sum += square[i][j];
i++;
j++;
if(sum>s){
return 0;
}
}
if(sum!=s){
return 0;
}
sum = 0;
i=0;
j = n - 1;
while(i<n&&j>=0){
sum += square[i][j];
i++;
j--;
if(sum>s){
return 0;
}
}
if(sum!=s){
return 0;
}
return 1;
}
void clear(int n,int (*square)[n]){
int i, j;
for (i = 0; i < n;i++){
for (j = 0;j<n;j++){
square[i][j] = 0;
}
}
}