火柴棒等式 - 搜索

83 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:

49.png 注意:

  1. 加号与等号各自需要两根火柴棍
  2. 如果A≠B,则 A+B=C 与 B+A=C 视为不同的等式(A,B,C>=0)
  3. n根火柴棍必须全部用上

来源:洛谷 www.luogu.com.cn/problem/P11…

输入格式

一个整数n(n<=24)。

18

输出格式

一个整数,能拼成的不同等式的数目。

9

二、思路分析:

  1. 使用火柴棒拼等式, 我们只要把数字对应的火柴棒个数记录,看看既满足等式又满足火柴棒个数的等式有哪些即可,例如拼 0 需要6根火柴棒、 拼1需要2根火柴棒......拼11需要4根火柴棒.......
  2. 因为n<=24, 又1只需要2根火柴棒,可以得知最大的等式也就1111+1=1112,还超出了24根, 这里注意 + 号和 = 号各需要2根火柴棒,所以我们只要求出 0~1111需要的火柴棒个数即可
  3. 将求出的火柴棒数存到数组中,这样我们求 i 的火柴棒数就直接取 b[i] , 求 j 的火柴棒数就直接取 b[j] ,求 i+j 的火柴棒数就直接取 b[i+j]

三、AC 代码:

import java.util.Scanner;
public class Main {
     // count 统计合适的等式个数
	static int count = 0;
	public static void main(String[] args) {
		Scanner sr = new Scanner(System.in);
		int n = sr.nextInt();
           // 0~9 的数字火柴棒个数
		int[] a = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
		int[] b = new int[2001];
           // 由于我们分解数字需要用到一个条件while (t != 0) ,所以我们先给 b[0]赋好值
		b[0] = 6;
           // 1~2000的火柴棒个数
		for (int i = 1; i < 2001; i++) {
			int t = i;
			while (t != 0) {
				b[i] += a[t % 10];
				t = t / 10;
			}
		}
           // 搜索
		for (int j = 0; j < 1000; j++)
			for (int k = 0; k < 1000; k++) {
				if (b[j] + 2 + b[k] + 2 + b[j + k] == n) {
					count++;
				}
			}
		System.out.println(count);
	}
}

四、总结:

很简单的一道搜索题,主要就是我们需要先把 0~1111 数字需要的火柴棒个数算出来(这里直接求到了2000),再进行一个判断,不要忘记 + 和 = 也需要火柴棒哦