这个要使用全排列算法,25个数全排列有52兆组合,不知道你电脑有多快,反正我等了2个多小时也没有出结果。代码如下:
程序代码:
#include <stdio.h>
const int n=5; //幻方行列元素个数
void listArray(int *p,int s)
{//显示符合条件的幻方
int i,j,k=0,c=0,r=0;
for(i=0;i<s;i++)k+=p[i];//第一行的和,作为各行列、对角和的参考
if(k==65)
k=k;
for(i=0;i<s;i++)
{
c=0;
r=0;
for(j=0;j<2;j++)
{
c+=p[i*s+j];
r+=p[j*s+i];
}
if(c!=k||r!=k)return;//判断行列是否相等,两个判断return去掉可以显示全部组合
}
c=0;
r=0;
for(i=0;i<s;i++)
{
j=s-i-1;
c+=p[i*s+i];
r+=p[j*s+j];
}
if(c!=k||r!=k)return;//判断两对角线是否相等,两个判断return去掉可以显示全部组合
for(i=0;i<s;i++)
{
for(j=0;j<s;j++)printf("%d\t",p[i*s+j]);
printf("\n");
}
printf("**********\n");
}
void prep(int *p,int s,int e)
{//全排列,参考了网上代码,把n值放小点可验证其算法运行正确
int i,j;
if(s>=e*e)
{
listArray(p,e);
return;
}
for(i=s;i<e*e;i++)
{
j=p[i];
p[i]=p[s];
p[s]=j;
prep(p,s+1,e);//函数递归
j=p[i];
p[i]=p[s];
p[s]=j;
}
}
void main()
{
int i,a[n][n],*p;
p=&a[0][0];
for(i=0;i<n*n;i++)p[i]=i+1;//对幻方赋原始值(1...25)
prep(&a[0][0],0,n);
}
[
本帖最后由 wmf2014 于 2015-1-27 17:58 编辑 ]