首页 > 代码库 > 【C++小白成长撸】--(续)双偶数N阶魔阵

【C++小白成长撸】--(续)双偶数N阶魔阵

原理:

  1. 把双偶数N阶魔阵均分为(N/4)^2个4阶魔阵(4*4)
  2. 每个魔阵的对角线都标为“-1”,其余位置标为“0”
  3. 从第一个位置(a[0][0])从左到右,从上到下(例如:a[0][0],a[0][1]……a[0][3],a[1][0])用自然数(从1开始)依次填充,每次填充数加一,遇到-1,跳过,但自然数继续计数
  4. 当第三步全部完成后,从最下面一个位置(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 }

 

【C++小白成长撸】--(续)双偶数N阶魔阵