神奇矩阵(9个数横竖对角线相加15)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/boxyuan/article/details/55211171

神奇矩阵:将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;
}


展开阅读全文

没有更多推荐了,返回首页