[山东科技大学OJ]1048 Problem K: 魔方阵
Time Limit: 1 Sec Memory Limit: 16 MB Submit: 8538 Solved: 4296 [][]
Description
所谓N阶魔方阵,是一个N*N的方阵,其元素由1到N^2组成,且方阵每行每列以及对角线的元素和相等。如三阶魔方阵:
8 1 6
3 5 7
4 9 2
魔方阵的规律如下:
从1~N*N的 各个数依次如下规则存放:
(1) 1在第一行中间一列;
(2) 每一个数存放的行比前一个数的行数减一,列数加一(如上的三阶方阵5在4的上一行,后一列);
(3) 如果上一个数在第一行,则下一个数在最后一行,列数加一;
(4) 如果上一个数在最后一列,则下一个数在第一列,行数减一;
(5) 如果按上述规则确定的位置已经有数,或上一个数在第一行第N列,则下一个数放在上一个数的正下方。
Input
输入包含多组数据,每组为一个小于100的正奇数。
Output
对于每个输入的N,输出N阶魔方阵;两组数据之间用一个空行分隔。方阵中每行每两个数之间有一个空格,行首和行末没有多余的空格。
Sample Input
3
Sample Output
8 1 6 3 5 7 4 9 2
HINT
Append Code
[][]
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define SIZE 100 int main() { int N,i,j,a[101][101],m,n; while(scanf("%d",&N)!=EOF){ m=1; for(i=1;i<=N;i++) for(j=1;j<=N;j++) a[i][j]=0; n=N/2+1; a[m][n]=1; for(j=2;j<=N*N;j++) { if(m==1&&n!=N) { m=N; n=n+1; } else if(n==N&&m!=1) { m=m-1; n=1; } else if(m==1&&n==N) { m=m+1; n=n; } else { m=m-1; n=n+1; } if(a[m][n]==0) a[m][n]=j; else { m=m+2; n=n-1; a[m][n]=j; } } for(i=1;i<=N;i++){ for(j=1;j<=N;j++) { if(j==1) printf("%d",a[i][j]); else printf(" %d",a[i][j]); } printf(" "); } printf(" "); } }
