[原创]N宫图原码(动态内存)
/******************************************************************************** Copyright @ 2009 MicroQ
* 作 者 : 黄 奇
* 文件名: magicSquare.c
* 日 期 :
* 版 本 :
* 功 能 : N宫图
* 描 述 :
*
*
*
*******************************************************************************/
#include <stdio.h>
#include <memory.h>
#include <stdlib.h>
typedef unsigned char element;
// 判断输入的维数程序是否可以处理
// 成功返回1,否则返回0
int check(int n)
{
if ((n & 0x1) != 1)
{
printf("对不起,程序还不支持偶数幻方!\r\n") ;
return 0;
}
if (n > 15 || n < 2)
{
printf("对不起,维数输入错误(太小或者太大了)!\r\n") ;
return 0;
}
return 1 ;
}
void Display(element *p, int n)
{
int i,
j;
for(i = 0; i < n; ++i)
{
for (j = 0; j < n; ++j)
{
printf("%4d", *(p + sizeof(element) * i * n + sizeof(element)*j)) ;
}
printf("\r\n") ;
}
}
void MagicSquare(int n)
{
int i ,
j ,
sum ;
element *p = (element *)malloc(sizeof(element)*n*n) ;
if (p == NULL)
{
return ;
}
memset(p, 0, sizeof(element) * n * n) ;
// 第一个元素在最下面那行的中间位置
i = n - 1;
j = n/2 ;
for (sum = 1; sum <= n*n; ++sum)
{
if (*(p + sizeof(element) * i * n + sizeof(element)*j) == 0 )
{
*(p + sizeof(element) * i * n + sizeof(element)*j) = sum;
i = (i + 1 + n ) % n ;
j = (j - 1 + n ) % n ;
}
else
{
i = (i - 1 + n ) % n ;
j = (j + 1 + n ) % n ;
// 找出一个空的位置
for(; *(p + sizeof(element) * i * n + sizeof(element)*j) != 0;
i = (i-1+n)%n)
{
;
}
*(p + sizeof(element) * i * n + sizeof(element)*j) = sum ;
i = (i + 1 + n) % n;
j = (j - 1 + n) % n;
}
}
Display(p, n);
free(p) ;
}
int main(void)
{
int n ;
while( scanf("%d", &n) > 0 && check(n) )
{
MagicSquare(n) ;
}
return 0;
} N里有春么?
页:
[1]