您的位置:首页 > 编程语言 > C语言/C++

反幻方 题目

2017-05-13 17:24 239 查看
反幻方

我国古籍很早就记载着

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
=i;
else continue;
create(n+1);
fhuanf
=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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息