幻方分为3类。奇阶幻方(奇数)、双偶幻方(能够被4整除,如8,12,16……)、单偶幻方(4m+2形式,如6,10……),构造算法各不相同。

下面的程序中,奇阶幻方的构造算法为Merzirac法。双偶幻方的构造算法为Spring法。单偶幻方的构造算法为Strachey法。

奇数幻方:

在第一行居中的方格内放1,依次向右上方填入2、3、4…,如果右上方已有数字,则向下移一格继续填写。

参考:http://blog.csdn.net/zheng0518/article/details/9006281

双偶幻方:

(1) 先把数字按顺序填。然后,按4*4把它分割成2*2个小方阵 。

(2) 每个小方阵对角线上的数字,换成和它互补的数。

参考:http://chenxuebiao3.blog.163.com/blog/static/274911182011111911429621/

单偶幻方:

参考:http://blog.sina.com.cn/s/blog_639b95e90100i6h4.html

各行列对角线的和公式为:sum=n*(n^2+1)/2  n为阶数

代码如下:

#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;int matrix[99][99] = {0};//生成奇数幻方
void CreateOddMagicSquare(int n)
{int x=0,y,mun =1;y=n/2;while ( mun <= n*n ){matrix[x][y] = mun;//通过x0、y0检测右上的是否已经填入数字int x0=x;int y0=y;x0--;y0++;//超界处理if(x0<0)x0+=n;if(y0 == n)y0= n - y0;if(0 == matrix[x0][y0] ){x = x0;y = y0;}else{//若有数字填入之前数字的下方x++;if(x == n)x = x-n;}mun ++;}
}//生成双偶幻方
void CreateDoubleEvenMagicSqure( int n )
{int num = 1;//从1到n的平方依次赋值for(int i=0;i<n;i++)for(int j=0;j<n;j++)matrix[i][j] = num++ ;//小正方形的对角线上的数字取其补数for(int i=0;i<n;i++)for(int j=0;j<n;j++){if(i%4==0 && abs(i-j)%4 == 0)for(int k=0;k<4;k++)matrix[i+k][j+k] = abs( n*n +1 - matrix[i+k][j+k] );else if (i%4==3 && (i+j)%4 == 3)for(int k=0;k<4;k++)matrix[i-k][j+k] = abs( n*n +1 - matrix[i-k][j+k] );}
}//生成单偶幻方
void CreateSingleEvenMagicSqure(int n)
{int k = n/2;CreateOddMagicSquare(k);//赋初值,左上最小,右下其次,右上再次,左下最大for(int i=0;i<k;i++)for(int j=0;j<k;j++){matrix[i+k][j+k] = matrix[i][j] + k*k;matrix[i][j+k]   = matrix[i][j] + k*k*2;matrix[i+k][j]   = matrix[i][j] + k*k*3;}//公式 n=4m+2 int m = (n-2) / 4;//交换x方向正中行的从左至右m-1个for(int i=0;i<m-1;i++){int buf = matrix[k/2][i];matrix[k/2][i] = matrix[k/2+k][i]; matrix[k/2+k][i] = buf;}int buf = matrix[k/2][k/2];//以及正中间的数matrix[k/2][k/2] = matrix[k/2+k][k/2];matrix[k/2+k][k/2] = buf;//交换除x正中间行的其他行对应数字m个for(int i=0;i<k;i++)for(int j=0;j<k/2;j++){if(i != k/2){int buf = matrix[i][j];matrix[i][j] = matrix[i+k][j];matrix[i+k][j] = buf;}}//交换最右边m-1个数字for(int i=0;i<k;i++)for(int j=n-1;j>n-1-(m-1) ; j--){int buf = matrix[i][j];matrix[i][j] = matrix[i+k][j];matrix[i+k][j] = buf;}}//幻方正确检查
bool Check(int n)
{int sum = (n*(n*n+1))/2;int SumA=0,SumB=0;for(int i=0;i<n;i++){for(int j=0;j<n;j++)SumA += matrix[i][j];if(SumA != sum)return false;SumA = 0; }for(int i=0;i<n;i++){for(int j=0;j<n;j++)SumA += matrix[j][i];if(SumA != sum)return false;SumA = 0; }for(int i=0;i<n;i++){SumA+=matrix[i][i];SumB+=matrix[i][n-i-1];}if(SumA!=sum||SumB!=sum)return false;return true;}int main()
{int n;cin>>n;if(n%2!=0)CreateOddMagicSquare(n);else if (n%4 == 0)CreateDoubleEvenMagicSqure(n);else if (n%2 == 0)CreateSingleEvenMagicSqure(n);for(int i=0;i<n;i++){for(int j=0;j<n;j++)cout<<matrix[i][j]<<"\t";cout<<endl<<endl;}if(!Check(n))cout<<"the ans is wrong"<<endl;else cout<<"right answer"<<endl;system("pause"); return 1;
}

任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。相关推荐

  1. 幻方解法之horse法生成奇阶幻方

    /* 程序思想参考百度百科上"幻方法则" 2015-01-27 http://baike.baidu.com/link?url=7ynfkLYfGv4f7PtQkuH4PSn_8I ...

  2. 【矩阵篇】九宫图/n宫图生成——Merzirac法生成奇阶幻方 Python实现

    Merzirac法 当n为奇数时,我们称幻方为奇阶幻方. Merzirac法生成奇阶幻方: 在第一行居中的方格内放1 以后按顺序,向右斜上方填写数字.(称为斜步) 若出到方阵上方,把该数字填到本该所在 ...

  3. 双偶幻方的c语言算法,单偶阶、双偶阶幻方的巧妙填法

    单偶阶.双偶阶幻方的巧妙填法 单偶阶.双偶阶幻方的巧妙填法 人气:150 ℃时间:2019-12-07 19:18:09 优质解答 一.双偶幻方的解法 能被4整除的n阶幻方叫双偶幻方,如8阶.12阶. ...

  4. 范宝兴:幻方与类自然数幻方(上)「片桐善直8阶间隔幻方」「同心6阶/8阶/10阶」...

    范宝兴:幻方与类自然数幻方(上)「片桐善直8阶间隔幻方」「 同心6阶/8阶/10阶」 ※※※※※※ 來稿時間:2016年11月11日下午2:49分. 貼博時間:2016年11月18日. ※※※※※※ ...

  5. SAP WM初阶根据Group Number来查询与之有关的TO单

    SAP WM初阶根据Group Number来查询与之有关的TO单 在SAP WM模块的2-Step picking流程里,我们会为需要做拣配的TR或者交货单创建Group,然后为Group来集中拣配 ...

  6. 爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,则最后剩下5阶;只有每步跨7阶,最后才正好1阶不剩。参考例

    爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,最后剩下1阶:若每步跨3阶,最后剩下2阶:若每步跨5阶,最后剩下4阶:若每步跨6阶,则最后剩下5阶:只有每步跨7阶,最后才正好1阶不剩.参考例 ...

  7. 爱因斯坦的题目:在你面前有一条长长的阶梯,如果每步跨2阶,那么最后剩1阶;如果每步跨3阶,那么最后剩2阶.....................

    在你面前有一条长长的阶梯,如果每步跨2阶,那么最后剩1阶:如果每步跨3阶,那么最后剩2阶:如果每步跨5阶,那么最后剩4阶:如果每步跨6阶,最后剩5阶:只有当每步跨7阶时,最后才正好走完,一阶也不剩.请 ...

  8. C 求爱因斯坦数学题有一条长阶,若每步跨 2阶 ,则 最后剩 l阶,

    //求爱因斯坦数学题. //有一条长阶,若每步跨 2阶 ,则 最后剩 l阶, //若每步跨 3阶, 则最后剩 2阶 , //若每步跨 5阶 ,则最后剩 4阶 //每步跨 6阶 ,则最后剩 5阶 //每 ...

  9. 高阶累积量四阶矩_高阶累积量.ppt

    高阶累积量 内 容 经典谱估计与现代谱估计 参数模型法概述 基于AR模型的谱估计法 最大熵谱估计算法 最小方差谱估计 基于矩阵特征分解的谱估计 高阶谱估计 内 容 随机信号的特征 经典谱估计与现代谱估 ...

最新文章

  1. System.Windows.Forms.ListView : Control
  2. matlab ga rbf,GA PSO优化的RBF神经网络
  3. java 打印一棵树_java编程题之从上往下打印出二叉树
  4. OC----内存管理
  5. expect() php,Linux expect 的安装
  6. 10恢复出厂设置_笔记本电脑怎么恢复出厂设置
  7. ViewPager报UnsupportedOperationException: Required method instantiateItem was not overridden错误
  8. yolov5的head修改为decouple head
  9. 获取汉字拼音首字母方法
  10. python输入名字配对情侣网名_名字匹配情侣网名
  11. codeblocks无法找到编译器问题的三个原因
  12. 1 初识Mybatis
  13. 【案例分享】让新时代教育发展与“数”俱进
  14. Tensorflow of python36 in win10
  15. 支付10秒倒计时链接页面跳转
  16. 春暖花开,我们去踏青
  17. MySQL燕十八老师课程笔记:第九课:having筛选
  18. 涨知识!关于外贸单证知识,什么是单证一致!
  19. 科普向 | Lucene,Solr,Elasticsearch之间的区别和联系
  20. 51单片机定时器秒计数时钟+Proteus仿真

热门文章

  1. android 禁止view滚动条,Android:禁止滚动的解决方法
  2. edusrc交大新年第一炮
  3. 微信小程序中的省市区选择器
  4. 带你玩转自定义view系列
  5. 卢克服务器连接不稳定,DNF:跨五服务器崩了,打卢克的玩家都掉线了,坐等策划补偿?...
  6. steam战地5无法启动解决方法 战地1、5等EA游戏无法启动解决方法
  7. openCV-python实现颜色识别
  8. 数据分析入门之KNN影片类型和癌症预测
  9. 搭建 Hexo 个人博客和 Matery 主题的配置优化
  10. 优化之SpringBoot 内置tomcat 调优测试