• 奇数阶魔方问题


    问题: 一个 n 阶方阵的元素是1,2,...,n^2,它的每行,每列和2条对角线上元素的和相等,这样
    的方阵叫魔方。n为奇数时我们有1种构造方法,叫做“右上方” ,例如下面给出n=3,5,7时的魔方.
    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
    7
    30 39 48 1 10 19 28
    38 47 7 9 18 27 29
    46 6 8 17 26 35 37
    5 14 16 25 34 36 45
    13 15 24 33 42 44 4
    21 23 32 41 43 3 12
    22 31 40 49 2 11 20
    第1行中间的数总是1,最后1行中间的数是n^2,他的右边是2,从这三个魔方,你可看出“右
    上方”是何意。

    Input
    包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(3<=n<=19)是奇数。
    Output
    对于每组数据,输出n阶魔方,每个数占4格,右对齐
     
    Sample Input
    2
    3
    5
    Sample Output
       8   1   6
       3   5   7
       4   9   2
      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

    回答:

    #include<stdio.h>
    #include<stdlib.h>
    #define max 20
    int main()
    {
        int n;
        scanf("%d",&n);
        while(n--)
        {
            int a[max][max]={0};
            int i,j,x=1,y,m;
            scanf("%d",&m);
            a[1][(m+1)/2]=1;
            y=(m+1)/2;
            for(i=2;i<=m*m;i++)
            {
                if(x-1>0&&y-1>0)
                {
                   x=x-1;
                   y=y-1;
                   if(a[x][y]==0)
                      a[x][y]=i;
                   else {
                     x=(x+2)%m;
                     y=(y+1)%m;
                     if(x==0) x=x+m;
                     if(y==0) y=y+m;
                     a[x][y]=i;
                         }
                       continue;
                }
             if(x-1<=0&&y-1>0)
                {
                  x=x-1+m;
                  y=y-1;
                   if(a[x][y]==0)
                      a[x][y]=i;
                else {
                     x=(x+2)%m;
                     y=(y+1)%m;
                      if(x==0) x=x+m;
                     if(y==0) y=y+m;
                     a[x][y]=i;
                     }
                 continue;
                }
             if(x-1>0&&y-1<=0)
                {
                 x=x-1;
                 y=y-1+m;
                 if(a[x][y]==0)
                      {a[x][y]=i;}
                 else {
                        x=(x+2)%m;
                        y=(y+1)%m;
                        if(x==0) x=x+m;
                        if(y==0) y=y+m;
                        a[x][y]=i;
                     }
                     continue;
                }
              if(x-1<=0&&y-1<=0)
                {
                 x=x-1+m;
                 y=y-1+m;
                 if(a[x][y]==0)
                      a[x][y]=i;
                else {
                     x=(x+2)%m;
                     y=(y+1)%m;
                     if(x==0) x=x+m;
                     if(y==0) y=y+m;
                     a[x][y]=i;
                     }
                  continue;
                }
             }
            for(i=1;i<=m;i++)
            {
                for(j=m;j>=1;j--)
                {
                    printf("%4d",a[i][j]);
                }
               printf(" ");
            }
        }
        return 0;
    }

  • 相关阅读:
    第十四节、FAST角点检测(附源码)
    第三十六节,目标检测之yolo源码解析
    《理财市场情绪监测系统》代码实现【1】之行业词库
    python numpy 下载地址
    hive 添加自增列
    excel做回归分析的应用【风控数据分析】
    SELECT a.loginname,a.deviceid,a.time,Row_Number() OVER (partition by a.loginname ORDER BY a.deviceid desc,a.time asc) rank
    hive cst 时间转换
    hive以文件创建表
    以当前日期命名或复制文件夹
  • 原文地址:https://www.cnblogs.com/benchao/p/4494812.html
Copyright © 2020-2023  润新知