神奇矩阵:将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;}
新闻热点
疑难解答