1. 程式人生 > >輸出奇數N階魔方陣(幻方陣)

輸出奇數N階魔方陣(幻方陣)

從鍵盤輸入一個奇數N,輸出N階“魔方陣”。

 所謂魔方陣是指這樣的方陣,它的每一行、每一列和對角線之和均相等。例如3階魔方陣為:

 8   1   6

 3   5   7

 4   9   2

 魔方陣的奇數排列規律是:

 (1) 將1放在第一行中間一列;

 (2) 從2開始直到n×n止各數依次按下列規則存放:

 按 45°方向向右上走,每一個數存放的行比前一個數的行數減1,列數加1;

 (3) 如果行列範圍超出矩陣範圍,則迴繞。

 例如1在第1行,則2應放在最後一行,列數同樣加1;

 又如某個數在第n列,則下一個數應放在第一列,行數同樣減1;

 (4) 如果按上面規則確定的位置上已有數,或上一個數是第1行第n列時,則把下一個數放在上一個數的下面。

演算法實現 

void rubikCube(int n) {
    int cube[n][n],k,i,j;
    
    for (i=0; i<n; i++) {       //初始化陣列賦0值
        for (j=0; j<n; j++) {
            cube[i][j]=0;
        }
    }
    i=0;        //確定1的下標
    j=n/2;
    for (k=1; k<=n*n; k++) {     //依次錄入所有數共n*n個
        cube[i][j]=k;
        
        if (cube[(i-1+n)%n][(j+1+n)%n]==0) {
            i=(i-1+n)%n;
            j=(j+1+n)%n;
        }
        else {      //位置上已有數的情況
            i=(i+1+n)%n;
        }
    }
    for (i=0; i<n; i++) {       //魔方陣列印輸出
        for (j=0; j<n; j++) {
            printf("%d\t",cube[i][j]);
        }
        printf("\n");
    }
    printf("\n");
}