SDUST 作业10 Problem D 魔方阵
Posted Wade_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SDUST 作业10 Problem D 魔方阵相关的知识,希望对你有一定的参考价值。
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
这道题需要注意的地方是边界处理,采用的技巧有取余和边测边写
1 #include <stdio.h> 2 #include <string.h> 3 int a[105][105]; 4 int main(){ 5 int n; 6 int k=0; 7 while(scanf("%d",&n)!=EOF){ 8 if(!k)k=1;else printf("\n"); 9 memset(a,0,sizeof(a)); 10 a[0][n/2]=1; 11 int r=0,c=n/2; 12 int r0=0,c0=n/2; 13 for(int i=2;i<=n*n;i++){ 14 r=((r+n)-1)%n; 15 c=((c+n)+1)%n; 16 if(a[r][c]||(r0==0&&c0==n-1)){ 17 a[r0+1][c0]=i; 18 r=r0+1;c=c0; 19 } 20 else{ 21 a[r][c]=i; 22 } 23 r0=r;c0=c; 24 } 25 for(int i=0;i<n;i++){ 26 for(int j=0;j<n-1;j++){ 27 printf("%d ",a[i][j]); 28 } 29 if(n)printf("%d",a[i][n-1]); 30 printf("\n"); 31 } 32 } 33 return 0; 34 }
以上是关于SDUST 作业10 Problem D 魔方阵的主要内容,如果未能解决你的问题,请参考以下文章