双偶幻方的c语言算法,任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。...

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

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

奇数幻方:

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

双偶幻方:

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

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

单偶幻方:

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

代码如下:

#include

#include

#include

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

for(int j=0;j

matrix[i][j] = num++ ;

//小正方形的对角线上的数字取其补数

for(int i=0;i

for(int j=0;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

for(int j=0;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

{

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

for(int j=0;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

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

{

for(int j=0;j

SumA += matrix[i][j];

if(SumA != sum)

return false;

SumA = 0;

}

for(int i=0;i

{

for(int j=0;j

SumA += matrix[j][i];

if(SumA != sum)

return false;

SumA = 0;

}

for(int i=0;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

{

for(int j=0;j

cout<

cout<

}

if(!Check(n))

cout<

else

cout<

system("pause");

return 1;

}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值