evilknight 发表于 2009-7-28 21:23:44

[原创]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;
}

boy 发表于 2009-7-30 00:30:44

N里有春么?
页: [1]
查看完整版本: [原创]N宫图原码(动态内存)