现在的位置: 首页 > 综合 > 正文

n阶魔方

2019年10月02日 ⁄ 综合 ⁄ 共 908字 ⁄ 字号 评论关闭

n阶魔方是个填数字的游戏,游戏中要求将1~n*n个数字不重复地填入一个由n行n列共n*n个放个组成的方阵中,使得方阵中的每一行,每一列及两个对角线上的数字之和分别等于

同一个数,这里讨论的是n为奇数的情况。例如3阶魔方如下:

3阶魔方
6 1 8
7 5 3
2 9 4

在产生一个魔方时,可以用一个二维数组square[0..n-1][0..n-1]来表示这个方阵。在具体填数之前先将方阵的所有元素清零,然后按一定规律将1~n*n个数填入方阵中。规律如下:

先将第1个数"1"填入方阵中第1行位置居中的方格中,若用(i, j)分别表示方阵中(数组中)某一个位置的行坐标和列坐标,则第一个数的位置为(0, n/2).每填入一个数之后,将适合下一个数的位置修改为刚才已填入的这个数的位置(i, j)的左上角位置(i', j'),(i' = i-1, j' = j-1).对于这个位置,需要根据下面两种情况进行修改,然后将下一个数填入修改后的位置

1. 若(i', j')位置已经填过数,则修改为(i' + 2, j' + 1)的位置

2. 若i' 小于零,但j' 不小于零,则修改i' 为n-1; 若j'小于零,但i'不小于零,则修改j' 为n-1;若i' 与 j‘ 同时小于零,则将i' 修改为1,j' 修改为0.

在按照上述规则修改后的位置处填入一个数。用C语言描述如下:

#define MaxN 20

void magic( int square[][MaxN], int n ){
    int i, j, num;
    for( i = 0; i < n; i++ )
        for( j = 0; j < n; j++ ){
            square[ i ][ j ] = 0;  /*首先将方阵的所有元素清零*/
        }   

    i = 0;
    j = n/2;     /* 确定i, j 的初始位置 */
    for( num = 1; num <= n*n; num++ ){
        if( i < 0 && j < 0 || square[ i ][ j ] != 0 ){   /* 若square[i][j]位置处已填过数或者修改i,j后其值均小于0 */
            i += 2;
            j++;
        }   
        square[ i-- ][ j-- ] = num;    /* 填入一个数num,并修改位置(i,j)至其左上角 */

        if( i < 0 && j >= 0 ){        /* 修正i 的位置 */
            i = n-1;
        }   
        if( j < 0 && i >= 0 ){       /* 修正j 的位置 */
            j = n-1;
        }   
    }   
}

抱歉!评论已关闭.