zoukankan      html  css  js  c++  java
  • 奇数阶魔方问题

    问题: 一个 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;
    }

  • 相关阅读:
    清除缓冲
    iOS 10 开发 相机相关的适配
    UIImagePickerControllerDelegate---ActionSheet---获得设备型号
    4,4s屏幕过渡页处理
    iOS小技巧3
    UIWebView中Html中用JS调用OC方法及OC执行JS代码
    删除本地文件
    NSArray倒序
    tableView和scrollView滚动起冲突
    在UIScrollView的delegate方法判断滚动快慢
  • 原文地址:https://www.cnblogs.com/benchao/p/4494812.html
Copyright © 2011-2022 走看看