蓝桥杯第七届决赛 ----返幻方/C语言


反幻方

我国古籍很早就记载着

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

等都算作同一种情况。

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


 

/*

我是用的全排列,挨个测试,没有判重,不会。。。不知道怎么判断。。。
能力有限,将就看
希望大神看到后,能帮忙指点,怎么判重

*/

#include<stdio.h>
int count = 0;
int b[9];
int swap(int a[],int i,int j)
{
    int t = a[i];
    a[i] = a[j];
    a[j] = t;
}
int printff(int a[])//可以不输出,我就是为了测试 
{
    int i,j;
    count++;//这里如果不输出请把count挪到  f函数中的 (p == q)中的if(ceshi() == 1)中
    printf("%d个\n",count);
    for(i = 0; i < 9; i++)
    {
        if(i == 3 || i == 6)printf("\n");
         printf("%d ",a[i]);
    }
    printf("\n\n\n");
}
int ceshi(int a[])
{
    b[0] = a[0]+a[1]+a[2];
    b[1] = a[3]+a[4]+a[5];
    b[2] = a[6]+a[7]+a[8];
    b[3] = a[0]+a[3]+a[6];
    b[4] = a[1]+a[4]+a[7];
    b[5] = a[2]+a[5]+a[8];
    b[6] = a[2]+a[4]+a[6];
    b[7] = a[0]+a[4]+a[8];
    int i,j,c = 0;
    for(i = 0; i < 7; i++)
    {
        for(j = i + 1; j < 8; j++)
        {
            if(j== i)continue;
            if(b[i] == b[j])return 0;
        }
    }
    return 1;
}
int f(int a[],int p,int q)
{
    int i;
    if(p == q)
    {
        if(ceshi(a) == 1)
        printff(a);
    }
    else
    for(i = p; i <= q; i++)
    {
        swap(a,i,p);
        f(a,p+1,q);
        swap(a,i,p);
    }
}
int main()
{
    int a[9] = {1,2,3,4,5,6,7,8,9};
    f(a,0,8); 
    printf("%d",count/8);
}

猜你喜欢

转载自blog.csdn.net/weixin_42295018/article/details/88344669