任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。
幻方分为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++实现----奇阶幻方、双偶幻方、单偶幻方。相关推荐
- 幻方解法之horse法生成奇阶幻方
/* 程序思想参考百度百科上"幻方法则" 2015-01-27 http://baike.baidu.com/link?url=7ynfkLYfGv4f7PtQkuH4PSn_8I ...
- 【矩阵篇】九宫图/n宫图生成——Merzirac法生成奇阶幻方 Python实现
Merzirac法 当n为奇数时,我们称幻方为奇阶幻方. Merzirac法生成奇阶幻方: 在第一行居中的方格内放1 以后按顺序,向右斜上方填写数字.(称为斜步) 若出到方阵上方,把该数字填到本该所在 ...
- 双偶幻方的c语言算法,单偶阶、双偶阶幻方的巧妙填法
单偶阶.双偶阶幻方的巧妙填法 单偶阶.双偶阶幻方的巧妙填法 人气:150 ℃时间:2019-12-07 19:18:09 优质解答 一.双偶幻方的解法 能被4整除的n阶幻方叫双偶幻方,如8阶.12阶. ...
- 范宝兴:幻方与类自然数幻方(上)「片桐善直8阶间隔幻方」「同心6阶/8阶/10阶」...
范宝兴:幻方与类自然数幻方(上)「片桐善直8阶间隔幻方」「 同心6阶/8阶/10阶」 ※※※※※※ 來稿時間:2016年11月11日下午2:49分. 貼博時間:2016年11月18日. ※※※※※※ ...
- SAP WM初阶根据Group Number来查询与之有关的TO单
SAP WM初阶根据Group Number来查询与之有关的TO单 在SAP WM模块的2-Step picking流程里,我们会为需要做拣配的TR或者交货单创建Group,然后为Group来集中拣配 ...
- 爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,最后剩下1阶;若每步跨3阶,最后剩下2阶;若每步跨5阶,最后剩下4阶;若每步跨6阶,则最后剩下5阶;只有每步跨7阶,最后才正好1阶不剩。参考例
爱因斯坦曾出过这样一道数学题:有一条长阶梯,若每步跨2阶,最后剩下1阶:若每步跨3阶,最后剩下2阶:若每步跨5阶,最后剩下4阶:若每步跨6阶,则最后剩下5阶:只有每步跨7阶,最后才正好1阶不剩.参考例 ...
- 爱因斯坦的题目:在你面前有一条长长的阶梯,如果每步跨2阶,那么最后剩1阶;如果每步跨3阶,那么最后剩2阶.....................
在你面前有一条长长的阶梯,如果每步跨2阶,那么最后剩1阶:如果每步跨3阶,那么最后剩2阶:如果每步跨5阶,那么最后剩4阶:如果每步跨6阶,最后剩5阶:只有当每步跨7阶时,最后才正好走完,一阶也不剩.请 ...
- C 求爱因斯坦数学题有一条长阶,若每步跨 2阶 ,则 最后剩 l阶,
//求爱因斯坦数学题. //有一条长阶,若每步跨 2阶 ,则 最后剩 l阶, //若每步跨 3阶, 则最后剩 2阶 , //若每步跨 5阶 ,则最后剩 4阶 //每步跨 6阶 ,则最后剩 5阶 //每 ...
- 高阶累积量四阶矩_高阶累积量.ppt
高阶累积量 内 容 经典谱估计与现代谱估计 参数模型法概述 基于AR模型的谱估计法 最大熵谱估计算法 最小方差谱估计 基于矩阵特征分解的谱估计 高阶谱估计 内 容 随机信号的特征 经典谱估计与现代谱估 ...
最新文章
- System.Windows.Forms.ListView : Control
- matlab ga rbf,GA PSO优化的RBF神经网络
- java 打印一棵树_java编程题之从上往下打印出二叉树
- OC----内存管理
- expect() php,Linux expect 的安装
- 10恢复出厂设置_笔记本电脑怎么恢复出厂设置
- ViewPager报UnsupportedOperationException: Required method instantiateItem was not overridden错误
- yolov5的head修改为decouple head
- 获取汉字拼音首字母方法
- python输入名字配对情侣网名_名字匹配情侣网名
- codeblocks无法找到编译器问题的三个原因
- 1 初识Mybatis
- 【案例分享】让新时代教育发展与“数”俱进
- Tensorflow of python36 in win10
- 支付10秒倒计时链接页面跳转
- 春暖花开,我们去踏青
- MySQL燕十八老师课程笔记:第九课:having筛选
- 涨知识!关于外贸单证知识,什么是单证一致!
- 科普向 | Lucene,Solr,Elasticsearch之间的区别和联系
- 51单片机定时器秒计数时钟+Proteus仿真