首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

3*3三阶魔方阵解决方法

2012-05-27 
3*3三阶魔方阵用数组求一个3*3的三阶魔方我找了很多关于这方面的资料但是没有有我想要的!要求: 算法和代码

3*3三阶魔方阵
用数组求一个3*3的三阶魔方我找了很多关于这方面的资料但是没有有我想要的!
要求: 算法和代码!
三阶魔方阵:  
  8 1 6  
  3 5 7  
  4 9 2  
  结果打印出1~n*n的自然数构成的魔方阵

[解决办法]
如下是算法伪代码:

C/C++ code
int[][] MagicMatrix ( int n ){    //Odd order.    if ( mod ( n, 2 ) )        [ mj, mi ] = MakeMeshGridSquareMatrix ( n );  // mj : mesh along row,                                                       // while mi : mesh along column                                                      // both mj and mi are square matrix        // matrix operation        A = mod ( mi + mj - ( n + 3 ) / 2.0, n );        B = mod ( mi + 2 * mj - 2, n );        M = n * A + B + 1;    // Doubly even order.    elif ( !mod ( n, 4 ) )        [ mj, mi ] = MakeMeshGridSquareMatrix ( n );        K = ( floor ( mod ( mi, 4 ) / 2.0 ) == floor ( mod ( mj, 4 ) / 2.0 ); // K is a logic matrix                                                                              // each element judge by                                                                              // mj and mi        M = MakeSquareMatrix ( n ); // to make array which from 1 to n * n as a n * n square        M [ K ] = n * n + 1 - M [ K ];  // modify matrix M each element from matrix K        // Singly even order    else        p = n / 2;        M = MagicMatrix ( p );      // Recursive call procedure;        M = [             M             M + 2 * p ^ 2              M + 3 * p ^ 2             M + p ^ 2     ]   // make a new matrix which elements layout                                                          // like this        if ( n == 2 )            return;     // error         end if        i = MakeRank ( p ); // get one column which elements are from 1 to p;        k = ( n - 2 ) / 4.0;        j = MakeRow ( k, n ); // make a row that [ 1 to k join with (n - k + 2) to n ];        M [ Rank(i, i + p), j ] = M [ Rank(i + p; i), j ]; // Rank 表示含有指定两个元素的列向量          i = k + 1;        j = Row ( 1, i );      // Row 表示含有指定两元素的行向量          M [ Rank(i, i + p), j ] = M [ Rank(i + p, i), j ];    end if} 

热点排行