题目描述
n为任意奇数,表示方阵的维度。如n=3,则将数字1~9不重复地填在3行3列的9个方格中,分别使得每一行、每一列、两个对角线上的元素之和都等于15。
6 1 8
7 5 3
2 9 4
输入格式
输入一个奇数
输出格式
输出填好数字的方阵,每个数字中间空一格,并且每行、每列、两条对角线的元素相加之和相等。
输入输出样例
说明/提示
将用做“魔方”的二维数组的所有元素清0;
第一个数填在第一行居中的位置上(i=0,j=n/2);
以后每填一个数后,将位置移到当前位置(i,j)的左上角,即做动作i=i-1,j=j-1;
根据不同情况对位置进行修正:
(1)若位置(i,j)上已经填数,或者i,j同时小于0,将位置修改为i=i+2,j=j+1;
(2)若i小于0,但j不小于0,修改i为n-1;
(3)若j小于0,但i不小于0,修改j为n-1
#include<stdio.h>
#include<stdlib.h>
void mf(int n,int **a)
{
int i,j;
i=0;
j=n/2;
a[i][j]=1;
for(int key=2;key<=n*n;key++)
{
if(key%n==1)
{
i=i+1;
}
else
{
i=i-1;
j=j-1;
}
/* if(i<0&&j<0)
{
i=i+2;
j=j+1;
}*/
if(i<0&&j>=0)
{
i=n-1;
}
if(i>=0&&j<0)
{
j=n-1;
}
a[i][j]=key;
}
}
int main()
{
int **a;
int key;
int i,j;
int n;
scanf("%d",&n);
a=(int**)malloc(sizeof(int*)*(n+1));
for(i=0;i<=n;i++)
{
a[i]=(int*)malloc(sizeof(int)*(n+1));
}
for(i=0;i<=n;i++)//数组初始化
{
for(j=0;j<=n;j++)
{
a[i][j]=0;
}
}
mf(n,a);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}