生成幻方的小程序

xiaoxiao2021-02-28  112

关于幻方的描述可以直接点击进入百度词条查看,这里不作赘述,下面一段代码是基于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); }
转载请注明原文地址: https://www.6miu.com/read-37435.html

最新回复(0)