1~9组成三个3位的平方数

http://blog.csdn.net/csy981848153/article/details/7650100

题目:将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,即每组三个数不允许有重复数字,也不许同其它组的三个数字重复,要求每组中的三位数都组成一个平方数。

//题目:将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,
//即每组三个数不允许有重复数字,也不许同其它组的三个数字重复,要求每组中
//的三位数都组成一个平方数。首先求出三位数中不包含0且是某个整数平方的三位
//数;然后将满足条件的三位数进行组合.
//BY AS1138 2011-06-21

#include <iostream>
using namespace std;

int main(void)
{
	int tem = 0;
	int a[21][3] = {0};
	int tval[3] = {0};
	int n = 0;
	int iTest[9] = {0};
	for (int i=11;i!=32;++i)
	{
       tem = i*i;
       for (int j=2;j>=0;--j)
       {
		   tval[j]= tem % 10;
		   tem /= 10;
       }
	   if (tval[0] == tval[1] || tval[1] == tval[2] || tval[0] == tval[2])  
		       continue;

	   a[n][0] = tval[0];
	   a[n][1] = tval[1];
	   a[n][2] = tval[2];
	   ++n;
	}
    
	//for (int i=0;i!=n;++i)
	//{
	//	 cout<<a[i][0]<<a[i][1]<<a[i][2]<<endl;
	//}

    for (int k=0;k!=n-2;++k)
    {
       

		for (int t=k+1;t!=n-1;++t)
		{
         
		   
		   for (int m=t+1;m!=n;++m)
		   {
			   iTest[a[k][0] - 1] = 1;
			   iTest[a[k][1] - 1] = 1;
			   iTest[a[k][2] - 1] = 1;
               
			   iTest[a[t][0] - 1] = 1;
			   iTest[a[t][1] - 1] = 1;
			   iTest[a[t][2] - 1] = 1;

			   iTest[a[m][0] - 1] = 1;
			   iTest[a[m][1] - 1] = 1;
			   iTest[a[m][2] - 1] = 1;

		       for (int i=0;i!=9;++i)
		      {
			   if (iTest[i] != 1)
				   break;

			   if(i == 8)
			     {
				   cout<<a[k][0]<<a[k][1]<<a[k][2]<<" "
				          <<a[t][0]<<a[t][1]<<a[t][2]<<" "
						  <<a[m][0]<<a[m][1]<<a[m][2]<<endl;
			      }	   
		       }//end for(int i)
			   for (int j=0;j!=9;++j)
			   {
				   iTest[j] = 0;
			   }
		   }//end for(int m)
		}//end for(int t)
    }//end for(int k)
	return 0;
}

和我的想法类似,我用的是回溯+剪枝,应该比这个n^3更快

完全平方数的最后一个数字肯定是1,4,5,6,9中的一个

所以把已经计算出来的完全平方数按照其最后一个数字分类

就把问题的规模从n转为n/2



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值