神奇矩阵:将1-9数字排成三行三列,使行,列,对角线上的数和均相同。
2 9 4
7 5 3
6 1 8
利用分治算法:
将每一行看作是一个三位整数,首先找出三位合为15,且三位数各不相同的三位数。
再枚举所有的排列组合,例如:初始时三行即为1,2,3将2,3互换即为1,3,2
代码:
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
int a,b,c,i,j,k,n=0,arr[100];
int a1,b1,c1,a2,b2,c2,a3,b3,c3;
//找出三位数和为15,且三位数各不相同的三位数
for(i=123;i<=987;i++)
{
a=i/100;//百位
b=i/10%10;//十位
c=i%10;//个位
if((a+b+c==15)&&(a!=c)&&(a!=b)&&(b!=c)&&(a!=0)&&(b!=0)&&(c!=0))
{
arr[n]=i;
n++;
}
}
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
for(k=j+1;k<n;k++)
{
a1=arr[i]/100;b1=arr[i]/10%10;c1=arr[i]%10;
a2=arr[j]/100;b2=arr[j]/10%10;c1=arr[j]%10;
a3=arr[k]/100;b3=arr[k]/10%10;c1=arr[k]%10;
if((a1+a2+a3==15)&&(b1+b2+b3==15)&&(c1+c2+c3==15)&&a1*a2*a3*b1*b2*b3*c1*c2*c3==32880)
{
if((a1+b2+c3)==15&&(c1+b2+a3)==15)
{
cout<<arr[i]<<endl<<arr[j]<<endl<<arr[k]<<endl<<endl;
}
if((a1+b3+c2)==15&&(c1+b3+a2)==15)
{
cout<<arr[i]<<endl<<arr[k]<<endl<<arr[j]<<endl<<endl;
}
if((a2+b1+c3)==15&&(c2+b1+a3)==15)
{
cout<<arr[j]<<endl<<arr[i]<<endl<<arr[k]<<endl<<endl;
}
if((a2+b3+c1)==15&&(c2+b3+a1)==15)
{
cout<<arr[j]<<endl<<arr[k]<<endl<<arr[i]<<endl<<endl;
}
if((a3+b2+c1)==15&&(c3+b2+a1)==15)
{
cout<<arr[k]<<endl<<arr[j]<<endl<<arr[i]<<endl<<endl;
}
if((a3+b1+c2)==15&&(c3+b2+a1)==15)
{
cout<<arr[k]<<endl<<arr[i]<<endl<<arr[j]<<endl<<endl;
}
}
}
}
}
return 0;
}