题目描述: 将 1-9 九个数不重复地赋给不同的 9 个元素 ,实现形如 a/bc+d/ef=f/hi 的形式: 例:1/26+5/78=4/39 1/32+5/96=7/84 (注意:1/26+5/78=4/39 和 5/78+1/26=4/39 只能算一种解) 求满足条件的解共有多少个? 思路: 要用回溯法
可见问题的解空间是9位的整数组,其约束条件是9位数字中没有相同的数字且必须满足分数式的要求。为此设置a数组,式中每一个数用一个数组元素表示:a[1]/a[2]a[3]+a[4]/a[5]a[6] = a[7]/a[8]a[9]。同时式中三个分母分别为:
m1 = a[2]a[3] = a[2]*10+a[3]; m2 = a[5]a[6] = a[5]*10+a[6]; m3 = a[8]a[9] = a[8]*10+a[9]
注意到等式左侧两分数交换次序只算一个解,为了避免重复,令a[1] < a[4]。
回溯程序代码:
#include<stdio.h>
void main()
{
int g, i, k, s, a[10];
long m1, m2, m3;
i = 1;
a[1] = 1;
s = 0;
while (1)
{
g = 1;
for (k = i - 1; k >= 1; k--)
{
if (a[i] = a[k])
{
g = 0;
break;
}
}
if (i == 9 && g == 1 && a[1] < a[4])
{
m1= a[2] * 10 + a[3];
m2 = a[5] * 10 + a[6];
m3 = a[8] * 10 + a[9];
if (a[1] * m2*m3 + a[4] * m1*m3 == a[7] * m1*m2)
{
printf("(%2d)", ++s);
printf("%d/%ld+%d/%ld = %d/%ld", a[1], m1, a[4], m2, a[7], m3);
if (s % 2 == 0) { printf("\n"); }
}
}
if (i < 9 && g == 1)
{ i++; a[i] = 1; continue; }
while (a[i] == 9 && i > 1)
{
i--; }
if (a[i] == 9 && i == 1)
{
break;
}
else
{
a[i]++;
}
}
printf("共有以上%d个解。\n", s);
}