如何为给定数量n打印魔法矩阵到n平方

时间:2015-03-06 07:20:14

标签: java matrix logic

我试图在程序谜语中实现矩阵逻辑。这不是一项家庭工作,我只是想自己练习,但如果没有指导或方法,可能会更进一步。

问题是假设我们已经给出了数字,假设n应该生成n * n个数字,并且具有以下模式

ex:Number is 3

1 2 3

7 8 9

4 5 6

如果数字是4那么明智 比

1 2 3 4

9 10 11 12

13 14 15 16

5 6 7 8

解决问题我使用了以下逻辑,但它无法给出预期的输出

public static void printPattern(int i){
    int num= i*i;
    int n=1;
    int[][] matrixArray = new int[i][i];

    for (int g=0;g<i ;g++ ){

        for (int j=0; j<i&& n<=num; j++,n++){
            System.out.println("i::"+i+"::j"+j+"number is :"+n);
            if (g!=0 &&g%2==0){
                System.out.println("g is "+g);
                matrixArray[g][j]=n;
            }
            else{
            matrixArray[g][j]=n;
            }
        }
    }

    for (int g=0;g<i ;g++ ) {

        for (int j = 0; j < i; j++) {
            System.out.print(matrixArray[g][j] + " ");
        }
        System.out.println();
    }
 }
}

2 个答案:

答案 0 :(得分:2)

这是一种更简单的方法。只需在主循环中的topbottom行之间保持交替,您就不必使用if-else构造。

public static void printMatrix(int num) {
    int n = 1;
    int[][] matrix = new int[num][num];
    for (int top = 0, bottom = num - 1; top <= bottom; top++, bottom--) {
        for (int i = 0; i < num; i++) {
            matrix[top][i] = n++;
        }
        if (top == bottom) {
            break;
        }
        for (int i = 0; i < num; i++) {
            matrix[bottom][i] = n++;
        }
    }
    for (int[] arr : matrix) {
        System.out.println(Arrays.toString(arr));
    }
}

此处循环一直运行到top越过bottom,即top = bottom + 1偶数行数。对于奇数行数,在填充该行一次之后break 时,循环top = bottom会消失。

输出: printMatrix(4); //甚至

[1, 2, 3, 4]
[9, 10, 11, 12]
[13, 14, 15, 16]
[5, 6, 7, 8]

输出: printMatrix(5); //奇数

[1, 2, 3, 4, 5]
[11, 12, 13, 14, 15]
[21, 22, 23, 24, 25]
[16, 17, 18, 19, 20]
[6, 7, 8, 9, 10]

答案 1 :(得分:1)

将内部for循环中的代码更改为以下

if (g % 2 == 1) { // Handle rows with odd index (second, fourth ...)
    matrixArray[i - (g + 1) / 2][j] = n;
} else { // First, third ... rows
    matrixArray[g / 2][j] = n;
}

See it run live