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


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*(2*m + 1),如果把整个魔方矩阵均分为4份,每份都是奇数阶,利用奇数阶的算法来填充。

(如图)

完成后的效果图

把最右边m-1列中B与C对应相交换

A的中间一行,从第二列开始,m格与对应D交换,其余从最左边开始m格与D对应交换

交换后的最终效果图

 

posted @ 2016-11-02 22:57  Amoshen  阅读(825)  评论(1编辑  收藏  举报