题目描述
给你n根火柴棍,你可以拼出多少个形如“A+B=CA+B=C”的等式?等式中的AA、BB、CC是用火柴棍拼出的整数(若该数非零,则最高位不能是00)。用火柴棍拼数字0-90−9的拼法如图所示:
注意:
加号与等号各自需要两根火柴棍
如果A≠BA
=B,则A+B=CA+B=C与B+A=CB+A=C视为不同的等式(A,B,C>=0A,B,C>=0)
nn根火柴棍必须全部用上
输入格式
一个整数n(n<=24)n(n<=24)。
输出格式
一个整数,能拼成的不同等式的数目。
输入输出样例
输入 #1 复制
14
输出 #1 复制
2
输入 #2 复制
18
输出 #2 复制
9
说明/提示
【输入输出样例1解释】
22个等式为0+1=10+1=1和1+0=11+0=1。
【输入输出样例2解释】
99个等式为:
0+4=4
0+11=11
1+10=11
2+2=4
2+7=9
4+0=4
7+2=9
10+1=11
11+0=11
除了题目给的0-9的火柴棍数目,我们还要自己求10-999 的火柴棍数目,开辟一个数据b来存a b c
import java.util.Scanner;
public class Main2 {
private static int[] f = new int[1001]; // 用来存放火柴棒的数量,下标对应着对应的数字
private static int[] b = new int[3]; // 用来判断a+b是否等于c
private static int count = 0;
private static int n;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
f[0] = 6;
f[1] = 2;
f[2] = 5;
f[3] = 5;
f[4] = 4;
f[5] = 5;
f[6] = 6;
f[7] = 3;
f[8] = 7;
f[9] = 6;
for (int i = 10; i <= 999; i++) {
f[i] = f[i / 10] + f[i % 10];
}
n = scanner.nextInt()-4;// 这里要减去+号和=号的火柴棍数
dfs(0);
System.out.println(count);
}
private static void dfs(int deep) {
for (int i = 0; i <= 999; i++) {
if (n - f[i] >= 0) {
n-=f[i];
b[deep] = i;
if (deep == 2) { // 如果已经取了三种数字的火柴出来
if (b[0] + b[1] == b[2] && n == 0) {// 比较是否满足条件
count++;
}
} else {
dfs(deep + 1);
}
n += f[i];//保存上一次的结果
}
}
}
}