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 }
复制代码

 

posted @   deepwzh  阅读(643)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示