双偶幻方的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;
}
總結
以上是生活随笔為你收集整理的双偶幻方的c语言算法,任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PHP获取带中英文括号的内容
- 下一篇: 招商银行网上银行控件存在安全隐患!