首页 > 试题广场 >

打印“魔方矩阵”。所谓魔方矩阵是指这样的方阵,它的每一行、每

[问答题]
打印“魔方矩阵”。所谓魔方矩阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方矩阵为:
8    1    6
3    5    7
4    9    2
推荐
矩阵中各数的排列规律如下。
(1)将1放在第一行中间一列。
(2)从2开始直到nXn止各数依次按下列规律存放:每一个数存放的行比前一个数的行数减1,列数加1 (例如上面的三阶魔方阵,5在4的上一行后一列)。
(3)如果上一数的行数为1,则下一个数的行数为n  (指最下一行)。例如1在第1行,则应放在最下一行,列数同样加1。
(4)当上一个数的列数为n时,下一个数的列数应为1,行数减1.例如2在第3行最后一列,则3应放在第2行第1列。
(5)如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7在6的下面。按此方法可以得到任何阶的魔方阵。
N-S图如下所示:
程序如下:
main()
{ int a[16][16],i,j,k,p,m,n;
 p=1;
 while(p= =1)
    {printf("请输人数n(n=1~15):");
    scanf(" %d ",&n);
    if((n! =0)&&(n< = 15)&&(n%2! =0))
    p=0;
        }
/*初始化* /
for(i=1;i< =n;i++ )
    for(j=1;j< =n;j++ )
        a[i][j]=0;
/*建立魔方阵*/
j=n/2+1;
a[1][j]=1;
for(k=2;k< =n*n;k++ )
    {i=i-1;
    j=j+ 1;
    if((i<1)&&(j>n))
        {i=i+2;
         j=j-1;
         }
    else
       {if(i<1) i=n;
         if(j>n)j=1;
         }
    if(a[i][j]= =0)
        a[i][j]=k;
    else
        {i=i+2;
         j=j-1;
        a[i][j]=k;
         }
    }
for(i=1;i< =n;i++ )    /*输出魔方矩阵*/
    {for(j=1;j< n;j++ )
        printf("%4d",a[i][j]);
    printf("\n");
    }
}
运行结果如下:
请输入数n(n=1~15):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


发表于 2018-08-13 20:42:06 回复(1)
public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n;
        while (true) {
            System.out.println("请输入要打印的魔方矩阵的阶数n(阶数不能为0或者偶数):");
            n = scanner.nextInt();
            if (n == 0 || n % 2 == 0) {
                System.out.println("你输入的阶数不符合要求,请重新输入!");
                continue;
            } else {
                break;
            }
        }
        int[][] arr = new int[n][n];
        // 确定1所在的列的索引
        int colIndexOfOne = n/2;
        arr[0][colIndexOfOne] = 1;
        int row=0;
        int col=colIndexOfOne;
        for (int i = 2; i <= n*n; i++) {
            if (arr[(row-1+n)%n][(col+1)%n]==0){
                row=(row-1+n)%n;
                col=(col+1)%n;
            }else {
                row++;
            }
            arr[row][col]=i;
        }
        System.out.println(n+"阶魔方矩阵打印为:");
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                System.out.print(arr[i][j]+"\t");
            }
            System.out.println();
        }
    }

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    
发表于 2019-09-02 16:25:16 回复(0)