1. 程式人生 > >魔方陣輸出

魔方陣輸出

如3×3的魔方陣[1] :
8 1 6
3 5 7
4 9 2
魔方陣的排列規律如下:
⑴將1放在第一行中間一列;
⑵從2開始直到n×n止各數依次按下列規則存放;每一個數存放的行比前一個數的行數減1,列數加1(例如上面的三階魔方陣,5在4的上一行後一列);
⑶如果上一個數的行數為1,則下一個數的行數為n(指最下一行);例如1在第一行,則2應放在最下一行,列數同樣加1;
⑷當上一個數的列數為n時,下一個數的列數應為1,行數減去1。例如2在第3行最後一列,則3應放在第二行第一列;
⑸如果按上面規則確定的位置上已有數,或上一個數是第一行第n列時,則把下一個數放在上一個數的下面。例如按上面的規定,4應該放在第1行第2列,但該位置已經被佔據,所以4就放在3的下面;
將第一行中間列的元素賦值為1。從第二個數開始,每個數都等於前一個數的行 - 1 列 +1,(但這裡還包含很多條件,如上條件所述)直到最終元素值等於n×n

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