用java写一个奇数魔方阵

魔方阵即下图所示
在这里插入图片描述
一个矩阵,每行每列及对角线相加的值都相等,称之为魔方阵
魔方阵填写规则:
1、"1"写在第一行最中间的位置
2、由“1”开始。按顺序填写,每次填写位置为当前位置的上一行,下一列
在填写过程中会遇到几种问题:
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
以上四种情况中红框表示当前位置上一行下一列所在地,但是会发现每种情况都会越界,所以数组中如何放入该值已写明

由写入步骤可知在编写代码时会遇到四种情况,为了代码书写的方便,可概括如下:
在这里插入图片描述
当遇到这种情况:i值必小于0,j值在数组范围内,即j < array[i].length;加粗红框为最特殊的情况,i<0,j >= array[i].length
在这里插入图片描述
这种情况i必大于0,而j值有两种情况:j>=array[i].length或者j<array[i].length

知道了有以上四种情况,则可以由此写出魔方阵代码,如下:

public class TestDemo {
   
    public static void rubiksCube(int[][] array, int n) {
        int i = 0;
        int j = array[i].length >> 1;
        array[i][j] = 1;
        for (int number = 2; number <= n * n; number++) {
            i--;
            j++;
            if (i >= 0) {
                if (j >= array[i].length) {//j >= 3
                    j = 0;
                } else {//j < 3
                    if (array[i][j] != 0) {
                        i += 2;
                        j--;
                    }
                }
                array[i][j] = number;
            } else {
                if (j > n - 1) {//i < 0,不能用array[i].length比较
                    i += 2;
                    j--;
                } else {
                    i = array.length - 1;//i移动到最后一行
                }
                array[i][j] = number;
            }
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[][] array = new int[n][n];
        rubiksCube(array, n);
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println("==================deepToString================");
        System.out.println();
        System.out.println(Arrays.deepToString(array));
    }
}

简化

public class TestDemo {

    public static void magicScqure(int[][] array,int n) {//3     1- 9
        array[0][n/2] = 1;
        int prevRow = 0;
        int prevCol = n/2;
        for(int i = 2;i <= n*n;i++) {
            if(array[(prevRow-1+n)%n][(prevCol+1)%n] != 0) {
                //上一行的下一列没有数据
                prevRow = (prevRow+1)%n;//下一行
            } else {
                prevRow = (prevRow-1+n)%n;
                prevCol = (prevCol+1)%n;
            }
            array[prevRow][prevCol] = i;
        }
    }

    public static void main(String[] args) {
        int row = 5;
        int[][] array = new int[row][row];
        magicScqure(array,row);
        System.out.println(Arrays.deepToString(array));
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43289802/article/details/83307782