注册 登录
编程论坛 C++教室

[讨论][求助]关于幻方的一道题

blueboy82006 发布于 2007-08-09 08:28, 500 次点击
把1--16填入一个4*4的方阵中,使相邻四数的和为34(包括两对角线)。怎么编程输出所有可能的
情况?
我想了几天了,编的程序越弄越复杂,大家帮忙看看怎么弄比较好啊?
3 回复
#2
blueboy820062007-08-09 08:30
记得在哪见过类似的贴,找不到了!
#3
blueboy820062007-08-09 09:29

我编了一个简陋的3*3的程序:
// 一个3*3的幻方的程序!

#include<iostream>
#include<algorithm>
using namespace std;

const N=3;
const M=15;

bool Row(int A[N][N]);
bool File(int B[N][N]);
bool Bias(int C[N][N]);

void main()
{
int A[N][N];
int a[N*N]={1,2,3,4,5,6,7,8,9}; //9个数的全排列!!!!
while(next_permutation(a,a+N*N))
{//----------------------------------------------------begin!!!!!!!!!!!!
for(int i(0);i<N;i++)

for(int j(0);j<N;j++)
{
A[i][j]=a[i*(N-1)+(i+j)];

if((i*(N-1)+(i+j)+1)%(N*N)==0)
{
if(Row(A) && File(A) && Bias(A))
{
for(int i(0);i<N;i++)
for(int j(0);j<N;j++)
{
cout<<A[i][j]<<" ";
if(j==N-1)
cout<<endl;
}
cout<<endl;
cout<<endl;

}

}
}
}//-----------------------------------------------------end!!!!!!!!!!!
cout<<endl<<"查找结束!"<<endl;



}

///////////////////////////////////////////////////////////////////////////////////////////
bool Row(int A[N][N]) //检验行满足要求!
{
int x(1);
int Sum1[N]={0,0,0};
for(int i(0);i<N;i++)
{
for(int j(0);j<N;j++)
Sum1[i]+=A[i][j];
if(Sum1[i]!=M)
{
x=0;
break;
}
}
if(x)
return true;
else
return false;
}

bool File(int B[N][N]) //检验列满足要求!
{
int x=1;
int Sum2[N]={0,0,0};
for(int i(0);i<N;i++)
{
for(int j(0);j<N;j++)
Sum2[i]+=B[j][i];
if(Sum2[i]!=M)
{
x=0;
break;
}
}
if(x)
return true;
else
return false;
}

bool Bias(int C[N][N]) //检验对角满足要求!
{
int a(0),b(0);
for(int i(0);i<N;i++)
{
a+=C[i][i];
b+=C[i][N-1-i];
}
if(a==M && b==M)
return true;
else
return false;
}
///////////////////////////////////////////////////////////////////////////////////////
问题是:用此方法编4*4时,不能执行了!
还请高手看看,指导一下啊
谢了!

#4
aipb20072007-08-09 11:16
都是有法可行的,基数阶幻方比较好实现,就一直按左上(右上)排列即可。

偶数阶就比较麻烦了,似乎是分两种情况,你去搜索下找找方法吧。
我觉得没多大意思,看了方法来做,最多就是个文字描述的编码!
1