1~9组成三个3位数的平方数。将1、2、3、4、5、6、7、8、9九个数字分成三组,每个数字只能用一次,即每组三个数不许有重复数字,要求每组中的三位数都组成一个平方数 **输入格式要求:提示信息:"The 3 squares with 3 different digits each are:\n" **输出格式要求:"%d,%d,%d\n" 程序运行示例如下: The 3 squares with 3 different digits each are: 361,529,784
#include <stdio.h>
#include <math.h>
int check(int a[3],int b[3]);
// 若两个用数组保存的三位数有重复元素,返回1;若没有,返回0
int main()
{
int num[21][3],t[3],a[3],b[3],c[3],flag;
int i,j,k,n,m;
//将所有合法三位数写入数组num。
for(i=11,j=0;i<=31;i++)
{
m=pow(i,2);
if(m%10!=0)
{
t[0]=m/100;
t[1]=(m/10)%10;
t[2]=m%10;
if(t[0]!=t[1]&&t[1]!=t[2]&&t[0]!=t[2])
{
num[j][0]=t[0];
num[j][1]=t[1];
num[j][2]=t[2];
j++;
}
}
}
n=j;//k记录了合法的三位数个数
printf("符合要求的3个三位数为:\n");
// 回溯法:使用三个嵌套的for循环来进行搜索,使用if语句实现剪枝
for(i=0;i<n-2;i++)
{
a[0]=num[i][0];
a[1]=num[i][1];
a[2]=num[i][2];
for(j=i+1;j<n-1;j++)
{
b[0]=num[j][0];
b[1]=num[j][1];
b[2]=num[j][2];
// 需进行检查,a与b两个三位数中没有重复数字,才寻找第三个三位数c;
//否则依赖for循环的作用,向后继续找b
flag=check(a,b);
if(flag)
{
// 寻找第3个三位数
for(k=j+1;k<n;k++)
{
c[0]=num[k][0];
c[1]=num[k][1];
c[2]=num[k][2];
flag=check(b,c)&&check(a,c);
if(flag)
printf("%d%d%d,%d%d%d,%d%d%d",a[0],a[1],a[2],b[0],b[1],b[2],c[0],c[1],c[2]);
}
}
}
}
return 0;
}
int check(int a[3],int b[3])
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(a[i]==b[j])
return 0;
}
}
return 1;
}