反幻方 题目

来源:互联网 发布:手机直播间源码 编辑:程序博客网 时间:2024/06/03 11:35

反幻方

我国古籍很早就记载着

2 9 4
7 5 3
6 1 8

这是一个三阶幻方。每行每列以及对角线上的数字相加都相等。

下面考虑一个相反的问题。
可不可以用 1~9 的数字填入九宫格。
使得:每行每列每个对角线上的数字和都互不相等呢?

这应该能做到。
比如:
9 1 2
8 4 3
7 5 6

你的任务是搜索所有的三阶反幻方。并统计出一共有多少种。
旋转或镜像算同一种。

比如:
9 1 2
8 4 3
7 5 6

7 8 9
5 4 1
6 3 2

2 1 9
3 4 8
6 5 7

等都算作同一种情况。

请提交三阶反幻方一共多少种。这是一个整数,不要填写任何多余内容。

——————————-宝宝是分割线,以下是代码———————————————————-

答案—————–3120小弟水平有限,方法比较粗略,还望各路大神指教。。。捂住脸(逃
    #include<stdio.h>    int fhuanf[10]={0};   //非幻方     int sum=0;              //个数     int xsum[8]={0};     //8条线和     int xsum_ss=0;          //线和下标     int is_legal(int xsum[8],int ss)   //判断各线和是否存在相等的情况 存在返回0  不存在返回1    {        for(int i=0;i<ss;i++)        {            for(int j=i+1;j<ss;j++)            {                if(xsum[i]==xsum[j]) return 0;            }        }        return 1;    }    void create(int n)    {           if(n==4)             {            xsum[xsum_ss++]=fhuanf[1]+fhuanf[2]+fhuanf[3];                  }        if(n==7)        {            xsum[xsum_ss++]=fhuanf[4]+fhuanf[5]+fhuanf[6];        }           if(n==8)        {            xsum[xsum_ss++]=fhuanf[1]+fhuanf[4]+fhuanf[7];            xsum[xsum_ss++]=fhuanf[3]+fhuanf[5]+fhuanf[7];        }        if(n==9)        {            xsum[xsum_ss++]=fhuanf[2]+fhuanf[5]+fhuanf[8];        }        if(n==10)        {            xsum[xsum_ss++]=fhuanf[7]+fhuanf[8]+fhuanf[9];            xsum[xsum_ss++]=fhuanf[1]+fhuanf[5]+fhuanf[9];            xsum[xsum_ss++]=fhuanf[3]+fhuanf[6]+fhuanf[9];        }        if(n>6&&!is_legal(xsum,xsum_ss))    //判断是否合乎要求        {   return;        }        if(n==10)          //满足要求            {                sum++;                return ;            }        if(n<10)      //依次给数组赋值        {            for(int i=1;i<10;i++)            {                int ok=1;                for(int j=1;j<n;j++)                {                    if(fhuanf[j]==i)                     {                        ok=0;break;                    }                }                if(ok) fhuanf[n]=i;                else continue;                create(n+1);                fhuanf[n]=0;                if(n==6||n==8||n==3)                {                       xsum_ss--;                    xsum[xsum_ss]=0;                                    }                if(n==7)                {                           xsum_ss-=2;                    xsum[xsum_ss]=xsum[xsum_ss+1]=0;                                    }                if(n==9)                {                                       xsum_ss-=3;                    xsum[xsum_ss]=xsum[xsum_ss+1]=xsum[xsum_ss+2]=0;                            }            }        }    }    int main()    {    create(1);    printf("%d",sum/8);       //所有反幻方总数为sum  而每一个矩阵的旋转和镜像有7个 加上本身有8个  所以直接用总数除以8就好了    return 0;       }
1 0
原创粉丝点击