文章标题

来源:互联网 发布:python爬虫抓取视频 编辑:程序博客网 时间:2024/05/29 03:11

单元程序演示提供了“幻方生成器”演示程序的简要说明以及链接,如有需要,请大家自行下载使用。

下面是源程序,输入幻方的阶n,屏幕上就会出现一个n阶幻方。具体原理请参见程序代码文件。

#include <stdio.h>#include <stdlib.h>//Scale of matrix#define MAX 20#define MIN 3int magic[MAX][MAX];//Show magic matrixvoid ShowMagic(int n){    int i, j;    //show data    for(i=0; i<n; i++)    {        for(j=0; j<n-1; j++)            printf("%d ", magic[i][j]);        printf("%d\n", magic[i][j]);    }}//Initialize the magicvoid InitMagic(int n){    int i, j;    for(i=0; i<n; i++)    {        for(j=0; j<n; j++)            magic[i][j] = 0;    //initialize every position with 0    }}//Odd-number scale method of magic squarevoid OddMagic(int offseti, int offsetj, int min, int n){    int tmpi, tmpj;     //save last number's position    int i;    tmpi = 0; tmpj = n / 2;    magic[tmpi + offseti][tmpj + offsetj] = min;    //the middle of first line is min    for(i=2; i<=n*n; i++)    {        tmpi = (tmpi - 1 + n) % n;        tmpj = (tmpj + 1) % n;        //check proper position        if(magic[tmpi + offseti][tmpj + offsetj] != 0)        {            tmpi = (tmpi + 2) % n;            tmpj = (tmpj - 1 + n) % n;        }        magic[tmpi + offseti][tmpj + offsetj] = i + min - 1;    }}//Double-even-number scale method of magic square(4N)void DoubleEvenMagic(int n){    int sum;    int tmp, ri, rj;        int i, j;    tmp = 1;    sum = n*n+1;    //original number     for(i=0; i<n; i++)    {        for(j=0; j<n; j++)            magic[i][j] = (tmp ++);     }    //find proper position and replace it with complementary number    for(i=0; i<n; i++)    {        for(j=0; j<n; j++)        {            ri = i % 4;            rj = j % 4;            //find proper position            if(((ri == 0 || ri == 3) && (rj == 0 || rj == 3)) ||                ((ri == 1 || ri == 2) && (rj == 1 || rj == 2)))            {                //replace with complementary number                magic[i][j] = sum - magic[i][j];            }        }    }}//Single-even-number scale method of magic square(4N+2)void SingleEvenMagic(int n){    int i, j, k;    int startj;    int tmp;    //create four odd magic matrixs    OddMagic(0, 0, 1, n/2);                     //A    OddMagic(n/2, n/2, (n/2)*(n/2) + 1, n/2);   //D    OddMagic(0, n/2, 2*(n/2)*(n/2) + 1, n/2);   //B    OddMagic(n/2, 0, 3*(n/2)*(n/2) + 1, n/2);   //C    k = (n - 2) / 4;    for(i = 0; i < n / 2; ++ i)    {        //A and C exchange        if(i == k)            startj = k;        else            startj = 0;        for(j = startj; j < startj + k; ++ j)        {            tmp = magic[i][j];            magic[i][j] = magic[i + n/2][j];            magic[i + n/2][j] = tmp;        }        //B and D exchange        startj = n - 1 - k;        for(j = startj; j > startj - k + 1; -- j)        {            tmp = magic[i][j];            magic[i][j] = magic[i + n/2][j];            magic[i + n/2][j] = tmp;        }    }}//Check input whether legal and calculatevoid GetMagic(int n){    if(n > MAX || n < MIN)    {        printf("The scale must be %d--%d!\n", MIN, MAX);        exit(-1);    }    InitMagic(n);    if(n % 2 == 1)        OddMagic(0, 0, 1, n);    else if(n % 4 == 0)        DoubleEvenMagic(n);    else        SingleEvenMagic(n);}int main(){    int n = 1;    printf("---------- Magic Square ----------\n");    printf("Input the number(3~30), and create the magic sqaure.\n");    printf("Input 0 to exit.\n\n");    while(1)    {        printf("Input the number: ");        scanf("%d", &n);        if(n == 0)            break;        else if(n >= 3 && n <= 20)        {            GetMagic(n);            ShowMagic(n);            printf("\n");        }        else            printf("Invalid input!\n\n");    }    printf("Thank you!\n");    return 0;}

这里写图片描述

原创粉丝点击