反幻方 题目

反幻方

我国古籍很早就记载着

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;   
    }
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值