关于幻方的描述可以直接点击进入百度词条查看,这里不作赘述,下面一段代码是基于K.N.King书后提供的思路,整理所得。
“将幻方存储在一个二维数组中。起始时把数1放在0行的中间,剩下的数2,3,……,n²依次向上移动一行并向右移动一列。当可能越过数组边间时需要‘绕回’到数组的另一端。例如:如果需要把下一个数放到-1行,我们就将他存储到n-1行(最后一行);如果需要把下一个数放到n列,我们就将其存储到0列。如果某个特定的数组元素已被占用,那就把该数存储咋前一个数的正下方,”[1]
代码如下:
/*
**幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。
*/
#include<stdio.h>
#include<stdlib.h>
int** CreateMagicSquare( const int MaxSize );
void Print( int** const Martrix, const int MaxSize );
void MagicSquare( int** Martrix, const int MaxSize );
void DeleteMartrix( int** Matrix, int MaxSize );
int main()
{
int N;
int** msMartrix;
printf("This program creates a magic square of a specified size.\n");
printf("The size must be an odd number.\n");
printf("Enter size of magic square: ");
scanf("%d", &N);
if( !(N&0x1) )
printf("invalid entering.");
else
{
msMartrix = CreateMagicSquare( N );
MagicSquare( msMartrix, N );
Print( msMartrix, N );
DeleteMartrix( msMartrix, N );
}
return 0;
}
int** CreateMagicSquare( const int MaxSize )
{
int i, j;
int** Martrix = (int**)malloc(MaxSize*sizeof(int));
if( !Martrix )
return NULL;
for( i = 0; i < MaxSize; i++ )
Martrix[i] = (int*)malloc(MaxSize*sizeof(int));
for( i = 0; i < MaxSize; i++ )
for( j = 0; j < MaxSize; j++ )
Martrix[i][j] = 0;
return Martrix;
}
void Print( int** const Martrix, const int MaxSize )
{
int i, j;
for( i = 0; i < MaxSize; i++ )
{
for( j = 0; j < MaxSize; j++ )
{
printf("] ", Martrix[i][j] );
}
printf("\n");
}
}
void MagicSquare( int** Martrix, const int MaxSize )
{
int i, line, row, next_line = 0, next_row = MaxSize/2;
for( i = 1; i <= MaxSize*MaxSize; i++ )
{
Martrix[next_line][next_row] = i;
line = (next_line - 1 + MaxSize) % MaxSize;
row = (next_row + 1 + MaxSize) % MaxSize;
if( Martrix[line][row] )
{
next_line = (next_line + 1) % MaxSize;
}
else
{
next_line = line;
next_row = row;
}
}
}
void DeleteMartrix( int** Martrix, int MaxSize )
{
int i;
for( i = 0; i < MaxSize; i++ )
free(Martrix[i]);
free(Martrix);
}