1. 程式人生 > >用java寫一個奇數魔方陣

用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));
    }
}