【问题描述】
"魔方阵"是指一个AN*N矩阵(在本题中N仅为奇数,且N>1),以自然数1,2, 。。。 N2为元素进行填充,每个位置上分别放置一个元素,使每行、每列以及主、副对角线上的元素之和都相等。
如3*3魔方阵,图在每行、每列、主对角线、副对角线上元素之和均为15:
8 1 6
3 5 7
4 9 2
奇数阶魔方阵的生成算法如下,初始矩阵A为空,从1开始依据下面的规则依次放置各个自然数(注意在下面的叙述中各元素行、列下标均以1-N计数):
1. 将1放在第一行正中的位置,即A[1, (j+1)/2];
2. 设最后放置的元素是A[i, j],则将下一个元素放在最后一个插入位置的右上方,即A[i-1, j+1]。但如果该位置已超出方阵的上边界(即如果i<0),则新位置取该列的最下一个位置,即A[N, j+1];如果该位置已超出方阵的右边界,取新位置取该行的最左一个位置,即A[i-1, 1]。
3. 若最近一个插入元素为N的整倍数,则新位置取最后插入元素下面的位置,即A[i+1, j]。
输入一个奇数N,打印对应的N阶魔方阵。
【输入形式】
控制台输入一奇数N。
【输出形式】
输出一个N*N的魔方阵,其中每个数字占4位字符的宽度,向右对齐。
【样例输入】
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
【样例说明】
输入奇数5,输出5阶魔方阵。
看题目与样例输出,可以得出规律,从1开始到n*n,每个数都在上个数的右上角,墙有穿透性,如果右上角已经被赋值则下个数向下走一格;
如此可以得出
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void mofang(int n){
int a[100][100]={0},i,q=0,p=0,j,_q,_p;
p=(n+1)/2-1;
//将1放在第一行正中的位置,即a[0, (j+1)/2-1];
a[q][p]=1;
for(i=2;i<=n*n;i++){
_q=q;//保存一开始的值
_p=p;
//在对角情况
if(q==0&&p==n-1){
q=n-1;
p=0;
}
//在第一行边界情况
else if(q==0){
q=n-1;
p=p+1;
}
//在最后一列边界
else if(p==n-1){
q=q-1;
p=0;
}
//普通情况
else{
q--;
p++;
}
//如果他的右上方被占领
if(a[q][p]!=0&&q==n-2){
q=0;
p=_p;
}
else if(a[q][p]!=0){
q=_q+1;
p=_p;
}
a[q][p]=i;
}
//输出
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%4d",a[i][j]);
}
printf("\n");
}
}
int main(int argc, char *argv[]) {
int n;
scanf("%d",&n);
mofang(n);
return 0;
}