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

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值