【C++小白成长撸】--(续)双偶数N阶魔阵
原理:
- 把双偶数N阶魔阵均分为(N/4)^2个4阶魔阵(4*4)
- 每个魔阵的对角线都标为“-1”,其余位置标为“0”
- 从第一个位置(a[0][0])从左到右,从上到下(例如:a[0][0],a[0][1]……a[0][3],a[1][0])用自然数(从1开始)依次填充,每次填充数加一,遇到-1,跳过,但自然数继续计数
- 当第三步全部完成后,从最下面一个位置(a[3][3]),从右到左,从下到上,计数从1开始,每次填充数加一,遇到填充了的位置,跳过,但自然数继续计数。
4阶魔阵示意图
1 /*程序的版权和版本声明部分: 2 **Copyright(c) 2016,电子科技大学本科生 3 **All rights reserved. 4 **文件名:双偶数N阶魔阵 5 **程序作用:双偶数N阶魔阵 6 **作者:Amoshen 7 **完成日期:2016.10.31 8 **版本号:V1.0 9 */ 10 #include <iostream> 11 12 using namespace std; 13 14 #define MAX_SIZE 100 15 16 int main(void) 17 { 18 int N,k,i,j,m1,m2,c = 1;//j,m1 m2,j代表行和列 19 int magic[MAX_SIZE][MAX_SIZE] = {0},b[MAX_SIZE][MAX_SIZE] = {0};//0代表没有数字 20 21 cout << "本程序实现双偶数N阶幻方矩阵,n = 4K.例如,如果要得到4阶幻方,请输入1"<<endl; 22 cout << "k = "; 23 cin >> k; 24 25 N = 4 * k; 26 27 //标识对角线不为空,用-1代表 28 for(m1 = 1;m1 <= k;m1++) 29 { 30 for(m2 = 1;m2 <= k;m2++) 31 { 32 for(i = 4 * (m1 - 1),j = 4 * (m2 - 1);i < (4*m1);) 33 { 34 b[i][j] = -1; 35 i = i + 1; 36 j = j + 1; 37 } 38 for(i = 4 * (m1 - 1) + 3,j = 4 * (m2 - 1);j < (4 * m2);) 39 { 40 b[i][j] = -1; 41 i = i - 1; 42 j = j + 1; 43 } 44 } 45 } 46 47 //填充魔方矩阵 48 49 for(i = 0;i < N;i++) 50 { 51 for(j = 0;j < N;j++,c++) 52 { 53 if(b[i][j] == -1) 54 { 55 continue; 56 } 57 else 58 { 59 magic[i][j] = c; 60 } 61 } 62 } 63 64 c = 1; 65 66 for(i = (N - 1);i >= 0;i--) 67 { 68 for(j = (N - 1);j >= 0;j--,c++) 69 { 70 if(b[i][j] == 0) 71 { 72 continue; 73 } 74 else 75 { 76 magic[i][j] = c; 77 } 78 } 79 } 80 81 //输出 82 83 cout << N <<"阶幻方矩阵:"<<endl; 84 85 for(i = 0;i < N;i++) 86 { 87 for(j = 0;j < N;j++) 88 { 89 cout << magic[i][j] << '\t'; 90 } 91 92 cout << endl; 93 } 94 }