魔方阵

来源:互联网 发布:2017人工智能最新消息 编辑:程序博客网 时间:2024/05/20 18:45

魔方阵, 百度百科里面的解释是:魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n2的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。说白了就是把1到n2填到n×n的方阵之中,使方阵每一行每一列和两个对角线的和都相同。这是C语言老师上课提到的一个小玩意,我感觉比较好玩就自己琢磨写了一个出来。

魔方阵根据n的大小主要分三种:奇数幻方,偶数且是4的倍数的方阵,偶数2(2m+1)的方阵。

对程序算法来讲,一个比一个难度递增。

奇数幻方:

奇数幻方的填充用的是斜线填充法,从第一行中间一列开始填充,其右上方为下一个数的位置,如果超出范围则按线平移,如果那个位置有数的话,就要退回到该数原位置的下面。具体程序如下(C语言):

int oddSquare(int n){//奇数阵int key, size = n*n;int i = 0, j = (n + 1) / 2;for (key = 1; key <= size; key++){if ((key%n) == 1){i++;}else{i--;j++;}if (i == 0)i = n;if (j > n)j = 1;square[i][j] = key;}return 0;}

4的倍数的偶数方阵:

(1)  先将整个方阵划分成k*k个4阶方阵,然后在每个4阶方阵的对角线上做记号 ;
(2)  由左而右、由上而下,遇到没有记号的位置才填数字,但不管是否填入数字,每移动一格数字都要加1 ;
(3)  自右下角开始,由右而左、由下而上,遇到没有数字的位置就填入数字,但每移动一格数字都要加1。

即先从对角线入手,具体程序如下(C语言):

int evenSquare(int n){//可以被4整除的偶数阵int i, j;int key, size = n*n;key = 1;for (i = 1; i <= n; i++){//非对角线for (j = 1; j <= n; j++){if ((i % 4 != j % 4) && (j + i) % 4 != 1){square[i][j] = key;}key++;}}key = size;for (i = 1; i <= n; i++){//对角线for (j = 1; j <= n; j++){if ((i % 4 == j % 4) || (j + i) % 4 == 1){square[i][j] = key;}key--;}}return 0;}
2(2m+1)的偶数方阵:

需要把方阵分成四个区域,ABCD,然后每个区域都是一个奇数幻方,但要注意的是,按照奇数幻方的填法填完之后还要进行调换,才能满足条件变成魔方阵,具体程序如下(C语言):

int oddEvenSquare(int n){//2(2m+1)魔方阵int m = (n / 2 - 1) / 2;int i = 0, j = (n / 2 + 1) / 2;int key, size = n*n / 4;for (key = 1; key <= size; key++){if ((key % (n / 2)) == 1){i++;}else{i--;j++;}if (i == 0)i = n / 2;if (j > n / 2)j = 1;square[i][j] = key;//A区域square[i + n / 2][j + n / 2] = key + size;//B区域square[i][j + n / 2] = key + 2 * size;//C区域square[i + n / 2][j] = key + 3 * size;//D区域}//进行调换for (i = 1; i <= n / 2; i++){//换左半两个小方阵中除了( 1 , k + 1 )的格位之外,小于k +1的列for (j = 1; j <= m; j++){if (i != m + 1){SWAP(square[i][j], square[i + n / 2][j]);}}}SWAP(square[m + 1][m + 1], square[m + 1 + n / 2][m + 1]);//左边中心格对调for (i = 1; i <= n / 2; i++){//右半两个小方阵中大于k+2的列对调for (j = n / 2 + m + 2; j <= n; j++){SWAP(square[i][j], square[i + n / 2][j]);}}return 0;}

这样一来就完成了所有魔方阵的填充,我在写程序的时候,在main方法中设置了数组大小为20,因为再大的话魔方阵画出来也不太好看,况且所有情况都已经检验过,举一反三。重要的是,进行了一次输入数据的分类,直接进行选择其应该用的算法。程序打包在此:我的魔方阵



0 0