日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發(fā)布時間:2023/12/20 c/c++ 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 双偶幻方的c语言算法,任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

幻方分為3類。奇階幻方(奇數(shù))、雙偶幻方(能夠被4整除,如8,12,16……)、單偶幻方(4m+2形式,如6,10……),構造算法各不相同。

下面的程序中,奇階幻方的構造算法為Merzirac法。雙偶幻方的構造算法為Spring法。單偶幻方的構造算法為Strachey法。

奇數(shù)幻方:

在第一行居中的方格內放1,依次向右上方填入2、3、4…,如果右上方已有數(shù)字,則向下移一格繼續(xù)填寫。

雙偶幻方:

(1) 先把數(shù)字按順序填。然后,按4*4把它分割成2*2個小方陣?。

(2) 每個小方陣對角線上的數(shù)字,換成和它互補的數(shù)。

單偶幻方:

各行列對角線的和公式為:sum=n*(n^2+1)/2??n為階數(shù)

代碼如下:

#include

#include

#include

using namespace std;

int matrix[99][99] = {0};

//生成奇數(shù)幻方

void CreateOddMagicSquare(int n)

{

int x=0,y,mun =1;

y=n/2;

while ( mun <= n*n )

{

matrix[x][y] = mun;

//通過x0、y0檢測右上的是否已經(jīng)填入數(shù)字

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

{

//若有數(shù)字填入之前數(shù)字的下方

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++ ;

//小正方形的對角線上的數(shù)字取其補數(shù)

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];

//以及正中間的數(shù)

matrix[k/2][k/2] = matrix[k/2+k][k/2];

matrix[k/2+k][k/2] = buf;

//交換除x正中間行的其他行對應數(shù)字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個數(shù)字

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;

}

總結

以上是生活随笔為你收集整理的双偶幻方的c语言算法,任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。