飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 2427|回复: 1

[C/C++] [原创]N宫图原码(动态内存)

[复制链接]
  • TA的每日心情
    开心
    2022-11-16 14:28
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2009-7-28 21:23:44 | 显示全部楼层 |阅读模式
    /*******************************************************************************
    *   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;
    }
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-7-30 00:30:44 | 显示全部楼层
    N里有春么?
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表