如图,这个算式中 A—I 代表 1—9 的数字,不同的字母代表不同的数字。
如: 6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
static int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
static int ans;
public static void main(String[] args) {
f(0);
System.out.println(ans);
}
static boolean check() {
int x = a[3] * 100 + a[4] * 10 + a[5];
int y = a[6] * 100 + a[7] * 10 + a[8];
if ((a[1] * y + a[2] * x) % (a[2] * y) == 0
&& a[0] + (a[1] * y + a[2] * x) / (a[2] * y) == 10)
return true;
else
return false;
}
/*
* 递归回溯生成全排列,适用于无重复元素的情况 考虑第k位,前面已经排定
*/
static void f(int k) {
if (k == 9) {// 一种排列已经生产
if (check())
ans++;
}
// 从k往后的每个数字都可以放在k位
for (int i = k; i < 9; i++) {
{
int t = a[i];
a[i] = a[k];
a[k] = t;
}
f(k + 1);
{
int t = a[i];
a[i] = a[k];
a[k] = t;
}
}
}
定义变量,算式中 A—I 代表 1—9 的数字 a [ ] 和结果 ans 。先通过f(0);
进行全排列,在全排列中进行check();
算法,最后输出结果。