6.7 魔方阵
题目要求:
输出“魔方阵”。所谓魔方阵是指这样的方正,它的每一行每一列和对角线之和均相等。如,三阶魔方阵:
要求输出1~n2的自然构成的魔方阵。
图解:
可以看到三种不同颜色的线,代表三种不同的状态
-
直接由行-1,列+1 找到空格子,直接赋值。
-
在行-1,列+1时,行列已经时边界,则到边界的一段要到另一端,在在空格子里赋值。
-
在上述两种行为后发现格子中已经存在数,则在原数的下方赋值。
(要是原始的下方也有值咋办,应该不会出现这个情况)
#include<stdio.h>
#define N 1000
int main()
{
int i,j,a[N][N]={0},n,k;
scanf("%d",&n);
a[0][n/2]=1; //初始赋值
int temp_i,temp_j;
for(i=0,j=n/2,k=2;k<=n*n;k++) //循环结束的条件时把1-n^2全都赋值完
{
temp_i=i; //保存前一个数的坐标
temp_j=j; //保存前一个数的坐标
i=i-1;
j=j+1;
if(i<0&&j>n-1) //如果上一个数是第一行第n列时
{
i=temp_i+1;
j=temp_j;
}
else
{
if(i<0)
i=n-1;
if(j>n-1)
j=0;
}
if(a[i][j]) //如果格子存在数
{
i=temp_i+1;
j=temp_j;
if(i>n-1)
i=0;
a[i][j]=k;
}
else //若是空格子直接赋值
a[i][j]=k;
}
//打印
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}
/*
输出结果
----------------------------
3
8 1 6
3 5 7
4 9 2
----------------------------
5
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
----------------------------
*/