全县网站建设管理工作会议召开,怎么做新网站才能被百度收录,电信网站备案系统,在线生成网站一、概念引入
幻方#xff08;Magic Square#xff09;是一种将数字安排在正方形格子中#xff0c;使每行、列和对角线上的数字和都相等的方法。
二、构造方法
对平面幻方的构造#xff0c;分为三种情况#xff1a;N为奇数、N为4的倍数#xff08;双偶数幻方#xff…一、概念引入
幻方Magic Square是一种将数字安排在正方形格子中使每行、列和对角线上的数字和都相等的方法。
二、构造方法
对平面幻方的构造分为三种情况N为奇数、N为4的倍数双偶数幻方、N为其它偶数(单偶数幻方4n2的形式 1、 N 为奇数时最简单 —————————————— ⑴ 将1放在第一行最中间 ⑵ 基于(1)从2开始到n×n的每一个数都按照右上角在二位数组中即行数减1列数加1填值的方式依次进行。 ⑶ 如果行列范围超出矩阵范围则回绕。例如1在第1行则2应放在最下一行列数同样加1; ⑷ 如果按上面规则确定的位置上已有数或上一个数是第1行第n列时则把下一个数放在上一个数的下面。 —————————————— 2、 N为4的倍数时双偶数幻方采用对称元素交换法 —————————————— ⑴把数1到n×n按从上至下从左到右顺序填入矩阵 ⑵将方阵的所有4×4子方阵中的两对角线上位置的数关于方阵中心作对 称交换即a(i,j与a(n1-i,n1-j交换所有其它位置上的数不变。 或者将对角线不变其它位置对称交换也可 —————————————— 3、 N 为其它偶数单偶数幻方即4n2形 —————————————— 1将矩阵平分为4个板块编号左上角为A板块右下角为B板块右上角为C板块左下角为D板块。注意顺序不能乱。 2把1到n/4填入An/41到n/2填入Bn/21到3*n/4填入C3*4/n1到n*n填入D分别构造奇数阶幻方奇数幻方构造法前面已经讲过这里不再重复且构造规则必须统一 3然后作相应的元素交换根据情况对行中的元素进行调换 注作相应的元素交换a(i,j与a(iu,j在同一列做对应交换j小于t或jn-t2),a(t-1,0与a(tu-1,0a(t-1,t-1)与a(tu-1,t-1)两对元素交换,其中un/2t(n2)/4 上述交换使行列及对角线上元素之和相等。 ——————————————
三、代码实现
1.奇数阶幻方 1C语言代码如下
#includestdio.h
#define ROW 5
#define COL ROWvoid OddMagic() //奇数阶魔方阵
{int arr[ROW][COL] { 0 };int row 0;int col ROW / 2;arr[row][col] 1; //对数字1的单独处理for (int i 2 ; i ROW * COL; i){/*规则23 */row (row ROW - 1) % ROW; /*这里加上ROW的原因是避免刚开始行出现负值。也可以写成row (row 0? ROW-1: row--)*/ col (col 1) % COL; /*也可以写成col (col COL-1 ? COL - 2; col)*/ /*规则4*/ if (arr[row][col] ! 0){row (row 2) % ROW;col (col - 1COL) % COL;}arr[row][col] i;}/*打印输出*/ for (int i 0; i ROW; i){for (int j 0; j COL; j){printf(%-2d , arr[i][j]);}printf(\n);}
}int main()
{OddMagic();
}
2运行结果 由于没有提供函数接口只是用宏的方法先定义幻方的阶。这里先以五阶幻方作为奇数阶幻方的输出结果等其他阶完成后统一整合。 2.N为四的倍数双偶数幻方 1四阶幻方C语言代码
#includestdio.h
#define ROW 4
#define COL ROWvoid MulOf4()
{int arr[ROW][COL] {0};int i 1; int temp; for (int row 0; row ROW; row)/*规则1*/{for (int col 0; col COL; col){arr[row][col] i; }}for (int row 0; row ROW/2; row)/*规则2*/{for (int col 0; col COL; col){if( rowcol || (rowcol) (ROW-1)) /*对角线元素围绕幻方中心做中心对称*/{temp arr[row][col];arr[row][col] arr[ROW-row-1][COL-col-1];arr[ROW-row-1][COL-col-1] temp;}}} /*打印输出*/ for (int i 0; i ROW; i){for (int j 0; j COL; j){printf(%-2d , arr[i][j]);}printf(\n);} } int main()
{MulOf4();
}
2双偶数幻方C语言代码
#includestdio.h
#includemath.h#define ROW 8
#define COL ROWvoid MulOf4n()
{int arr[ROW][COL] {0};int i 1; for (int row 0; row ROW; row)/*规则1*/{for (int col 0; col COL; col){arr[row][col] i; }}for (int row 0; row ROW; row)/*规则2*/{for (int col 0; col COL; col){if( row%4 0 abs(row-col)%4 0) /*可以想象为将大矩阵分成ROW/4^2个4*4小矩阵该语句表示所有4*4矩阵中的主对角线 */{for(int k0; k4; k){arr[rowk][colk] ROW*COL-arr[rowk][colk]1; }}else if(row%4 3 (rowcol)%4 3)/*该语句表示所有4*4矩阵中的副对角线*/ {for(int k0; k4; k){arr[row-k][colk] ROW*COL-arr[row-k][colk]1;}}}} /*打印输出*/ for (int i 0; i ROW; i){for (int j 0; j COL; j){printf(%-3d , arr[i][j]);}printf(\n);} } int main()
{MulOf4n();
}
3运行结果 3.N 为其它偶数单偶数幻方即4n2形 1C语言代码
#includestdio.h
#includemath.h#define ROW 6
#define COL ROWvoid MulOf4n_2()
{int arr[ROW][COL] {0};int x,y;xyROW/2;int arrA[x][y] {0};int row 0;int col ROW/4;int temp;for(int i1; ix*x; i)/*奇数阶幻方的另一种构造方法*/{arrA[row][col] i;if( i%x ! 0){row--;col;if(row0){rowrowx;}if(colx){colx-col;}}else{row;if(rowx){rowrow-x;}}} int k ROW/2;int i,j;ijROW;for (int i 0; i k; i)/*A、B、C、D四个小奇数阶幻方阵的构造*/ {for (int j 0; j k; j){arr[i][j] arrA[i][j];arr[i][jk] arrA[i][j]2*k*k; arr[ik][j] arrA[i][j]3*k*k;arr[ik][jk] arrA[i][j]k*k; }}/*行值的调整*/ int t(ROW-2)/4;for(int row0; rowk; row)for(int col0; colk; col){if((colt) (rowt)){temp arr[row][col];arr[row][col] arr[rowk][col];arr[rowk][col] temp;}if((colt) (rowk-t-1)){temp arr[row][col];arr[row][col] arr[rowk][col];arr[rowk][col] temp;}if((rowt rowk-t-1) (colt colt*2)){temp arr[row][col];arr[row][col] arr[rowk][col];arr[rowk][col] temp;}if(col1 colt){temp arr[row][col];arr[row][col] arr[rowk][col];arr[rowk][col] temp;}}/*打印输出*/ for (int i 0; i ROW; i){for (int j 0; j COL; j){printf(%-3d , arr[i][j]);}printf(\n);} } int main()
{MulOf4n_2();
}
2运行结果
由于此次项目涉及的代码较多在此我就不做函数整合了每种幻方的构造方法和代码都已给出仅供大家参考有什么疑问可以随时call我乐此不疲。