- /*
- 给出n值,输出n阶魔方阵(每一行,每一列和对角线之和都相等)
- 1放在第一行中间
- 从2开始以后的数按以下规则:
- 每个数比前一个数行数减一,列数加一
- 当上一个数行数为1,下一个数行数为n
- 当上一个数列数为n,下一个数列数为1
- 如果按以上规则确定的位置上已经有数,或上一个数为第一行第n列,把下一个数放在上一个数的下面
*/
#include<stdio.h>
int main()
{
int n,i,j;
int x,y;
int p,q;
int a[20][20]={0};
printf("输入一个奇数:");
scanf("%d",&n);
x = 0;
y = (n-1)/2;
a[x][y]=1;//第一行最中间的数为1
for(i=2;i<=n*n;i++){
p=x;q=y;//把上一个元素的位置记录在p q中以便继续使用
x=x-1;
y=y+1;
//如果上一个数为第一行第n列,把下一个数放在上一个数的下面
if(x== -1&&y==n){
x=p+1;
y=q;
a[x][y] = i;
// printf("one i值%d",i);
}
//当上一个数行数为1时,下一个数行数为
else if(x== -1&&y<=n-1){
x = n-1;
//如果按以上规则确定的位置上已经有数把
//下一个数放在上一个数的下面
if(a[x][y]!=0){
x = p+1;
y = q;
}
// printf("two i值%d",i);
a[x][y] = i;
}
//当上一个数列数为n,下一个数列数为1
else if(x>=0&&y==n){
y = 0;
//如果按以上规则确定的位置上已经有数把
//下一个数放在上一个数的下面
if(a[x][y]!=0){
x = p+1;
y = q;
}
a[x][y] = i;
}
//如果没有特殊情况,每个数比前一个数行数减一,列数加一
else if(x>=0&&y<=n-1){
// 如果按以上规则确定的位置上已经有数把
//下一个数放在上一个数的下面
if(a[x][y]!=0){
x = p+1;
y = q;
}
a[x][y] = i;
}
}
for(i=0;i<=n-1;i++){
for(j=0;j<=n-1;j++){
printf("%4d",a[i][j]);
}
printf("\n");
}
}