生成幻方的小程序

来源:互联网 发布:中文在线发音软件 编辑:程序博客网 时间:2024/04/27 14:21

关于幻方的描述可以直接点击进入百度词条查看,这里不作赘述,下面一段代码是基于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("%5d ", 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);
}

0 0
原创粉丝点击