1 /*程序的版权和版本声明部分:
2 **Copyright(c) 2016,电子科技大学本科生
3 **All rights reserved.
4 **文件名:单偶数N阶魔方矩阵
5 **程序作用:单偶数N阶魔方矩阵
6 **作者:Amoshen
7 **完成日期:2016.11.2
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 m,u,n,ROW,CIE,ROW1,CIE1,i,j;//ROW为行,CIE为列,ROW1为临时行变量,CIE1为临时列变量,i,j分别表示行变量和列变量
19 int MAGIC[MAX_SIZE][MAX_SIZE] = {0},b[MAX_SIZE][MAX_SIZE] = {0},EX[MAX_SIZE][MAX_SIZE] = {0};
20
21 cout << "请输入m,注意:n = 2*(2 * m + 1),即m输入1,得到一个6阶魔方矩阵"<<endl;
22 cout << "m = ";
23 cin >> m;
24
25 n = 2*(2 * m + 1);
26 u = n/2;
27 //先填充第一个u*u魔阵
28 ROW = 0;
29 CIE = (u - 1)/2;
30
31 MAGIC[ROW][CIE] = 1;
32 b[ROW][CIE] = 1;
33
34 for(i = 2;i <= (u*u);i++)
35 {
36 ROW1 = ROW - 1;
37 CIE1 = CIE + 1;
38
39 if(ROW1 < 0)
40 {
41 ROW1 = u - 1;
42 }
43 if(CIE1 > (u - 1))
44 {
45 CIE1 = 0;
46 }
47
48 if(b[ROW1][CIE1] == 0)
49 {
50 ROW = ROW1;
51 CIE = CIE1;
52 MAGIC[ROW][CIE] = i;
53 b[ROW][CIE] = 1;
54 }
55 else
56 {
57 ROW = ROW + 1;
58 if(ROW == u)
59 {
60 ROW = 0;
61 }
62 MAGIC[ROW][CIE] = i;
63 b[ROW][CIE] = 1;
64 }
65 }
66 //再填充第四个魔阵(右下角)
67 for(i = u;i < 2*u;i++)
68 {
69 for(j = u;j < 2*u;j++)
70 {
71 MAGIC[i][j] = MAGIC[i-u][j-u] + u*u;
72 }
73 }
74 //右上角
75 for(i = 0;i < u;i++)
76 {
77 for(j = u;j < 2*u;j++)
78 {
79 MAGIC[i][j] = MAGIC[i+u][j] + u*u;
80 }
81 }
82 //左下角
83 for(i = u;i < 2*u;i++)
84 {
85 for(j = 0;j < u;j++)
86 {
87 MAGIC[i][j] = MAGIC[i-u][j+u] + u*u;
88 }
89 }
90 //右上角与右下角的交换
91 for(i = 0;i < u;i++)
92 {
93 for(j = 2*u-1;j > (2*u-m);j--)
94 {
95 EX[i][j] = MAGIC[i][j];
96 MAGIC[i][j] = MAGIC[i+u][j];
97 }
98 }
99 for(i = 0;i < u;i++)
100 {
101 for(j = 2*u-1;j > (2*u-m);j--)
102 {
103 MAGIC[i+u][j] = EX[i][j];
104 }
105 }
106 //左上角与左下角的交换
107 for(i = 0;i < u;i++)
108 {
109 if(i == (u-1)/2)
110 {
111 for(j = 1;j <= m;j++)
112 {
113 EX[i][j] = MAGIC[i][j];
114 MAGIC[i][j] = MAGIC[i+u][j];
115 }
116 }
117 else
118 {
119 for(j = 0;j < m;j++)
120 {
121 EX[i][j] = MAGIC[i][j];
122 MAGIC[i][j] = MAGIC[i+u][j];
123 }
124 }
125 }
126 for(i = 0;i < u;i++)
127 {
128 if(i == (u-1)/2)
129 {
130 for(j = 1;j <= m;j++)
131 {
132 MAGIC[i+u][j] = EX[i][j];
133 }
134 }
135 else
136 {
137 for(j = 0;j < m;j++)
138 {
139 MAGIC[i+u][j] = EX[i][j];
140 }
141 }
142 }
143
144 cout << n << "阶魔方矩阵:" <<endl;
145
146 for(i = 0;i < 2*u;i++)
147 {
148 for(j = 0;j < 2*u;j++)
149 {
150 cout << MAGIC[i][j] <<'t';
151 }
152 cout <<endl;
153 }
154
155 return 0;
156 }
原理
因为是单偶数n = 2(2m + 1),如果把整个魔方矩阵均分为4份,每份都是奇数阶,利用奇数阶的算法来填充。
(如图)
完成后的效果图
把最右边m-1列中B与C对应相交换
A的中间一行,从第二列开始,m格与对应D交换,其余从最左边开始m格与D对应交换
交换后的最终效果图
原文链接: https://www.cnblogs.com/zpc-uestc/p/6024869.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/243237
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!