Java中的Magic Square程序帮助

时间:2019-02-22 21:34:41

标签: java algorithm magic-square

这是我们在计算机科学课程中处理2D数组的作业。我试图理解代码,但是不幸的是,我很难理解一些代码。这是我们提供的代码:

public class Magic {
    public static void main(String[] args) {

        // Initializing a variable named n and assigning the integer 3 to it
        int n = 3;
        // Initializing a multi-dimensional array with 3 rows and 3 columns max
        int m[][] = new int[n][n]; // 3 by 3

        int i, j;
        // Assigning 1 to variable num
        int num = 1;

        int nn = n * 3 / 2; //4


        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                m[(j - i + nn) % n][(i * 2 - j + n) % n] = num++; 

                System.out.println(num);
            } // next j
        } //next i

        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                System.out.print(m[i][j] + "\t");
            } // next j
            System.out.println();
        } //next i
    } //end main()
} //end class Magic

现在我的问题是我不理解以下代码片段:

for (i = 0; i < n; i++) {
    for (j = 0; j < n; j++) {
        m[(j - i + nn) % n][(i * 2 - j + n) % n] = num++;
    } 
}

这行代码在循环中做什么?我不确定为什么在此行中还会使用模数。是否有限制生成数字的范围?

m[(j - i + nn) % n][(i * 2 - j + n) % n] = num++;

2 个答案:

答案 0 :(得分:1)

您可以通过查看生成的魔术方块来获得一个想法,就像这样:

8   3   4   
1   5   9   
6   7   2

第一个坐标(其中i = 0和j = 0)分别为4%3 = 1和3%3 = 0。对于下一个坐标,j增加1,并使坐标左移一下。模运算符可确保坐标停留在正方形内。 j增3倍后,i增1且j重置为0,因此,每三步移动就直接向右移动。九步走后,广场就满了。

答案 1 :(得分:1)

m是“多维”数组(实际上只是一个数组),大小为n x n,因此该数组的最大索引为{{1 }}和n-1(因为索引从0开始)。

一种安全地索引到n-1的聪明方法是使用模运算符m。您可以将%除以a % b的结果视为“余数”(有关Java的模运算符here的更多信息)。

当您在a / ba % b处执行a >= 0时,结果总是严格小于b > 0。因此,在我们的情况下,模数用于索引到b中,该数字严格小于m(这是我们想要的,否则我们将获得一些超出范围的异常!)< / p>