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