• 奇数阶魔方问题


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

  • 相关阅读:
    深入浅出Google Android这本书怎么样
    iPhone开发实战这本书怎么样
    POST数据提交,关于System.Web.HttpUtility.HtmlEncode与System.Web.HttpUtility.UrlEncode的区别
    强烈推荐领域驱动设计与模式实战
    重构HTML: 改善Web应用的设计这本书怎么样
    关于C#与VB.NET网络通信开发实战的读后感
    关于Flex 3权威指南的读后感
    关于iPhone游戏编程实例的读后感
    强烈推荐iPhone开发秘籍
    强烈推荐高效程序员的45个习惯:敏捷开发修炼之道
  • 原文地址:https://www.cnblogs.com/benchao/p/4494812.html
Copyright © 2020-2023  润新知