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

(如图)

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

完成后的效果图

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

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

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

交换后的最终效果图

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

原文链接: https://www.cnblogs.com/zpc-uestc/p/6024869.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/243237

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午11:05
下一篇 2023年2月13日 下午11:06

相关推荐