player-none 发表于 2025-4-19 13:15:28

火柴棒等式

我只能想出以下代码,问号部分思路断了
#include <iostream>

using namespace std;

int main()
{
    int hcb={6,2,5,5,4,5,6,3,7,6};
    int n;
    cin>>n;
    n-=4;
    int t=n;
    while(n){
      ???
      for(int i=0;???;++i){
            n-=hcb;
      }
      ???
    }
    return 0;
}

题:



链接:https://code.xueersi.com/codeup/topic/list?tidan_id=27&problem_code=T0301710&package_name=CSP-J%E7%AE%97%E6%B3%95%E8%BF%9B%E9%98%B6

不二如是 发表于 2025-4-19 17:01:27

题目文字黏过来~

player-none 发表于 2025-4-19 17:48:45

不二如是 发表于 2025-4-19 17:01
题目文字黏过来~

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

注意:

1、加号与等号各自取两根火柴棍

2、如果A≠B,则A+B=C与B+A=C视为不同的等式(A,B,C≥0)

3、n根火柴棍必须全部用上

Clipboard Image.png
输入描述
一个整数n(1≤n≤24)
输出描述
一个整数,能拼成的不同等式的数目
样例1
输入
14
输出
2
样例2
输入
18
输出
9
提示

琅琊王朝 发表于 6 天前

player-none 发表于 2025-4-19 17:48
题目描述
给你n根火柴棍,你可以拼出多少个形如A+B=C的等式?等式中的ABC是用火柴棍评出来的整数(若该 ...

@Fishc

FishC 发表于 6 天前

琅琊王朝 发表于 2025-04-22 20:27
player-none 发表于 2025-4-19 17:48
题目描述
给你 ...

根据题意,我们需要找出所有满足A+B=C的火柴棍等式。以下是详细步骤和代码实现:

思路分析
1. 火柴棍数量预处理:每个数字0-9对应的火柴棍数已知。
2. 生成合法数字:用BFS生成所有可能的合法数字(无前导零),并记录每个数字的火柴棍数量。
3. 枚举所有组合:遍历所有A和B的组合,计算C=A+B,检查是否满足等式条件。


# 每个数字0-9需要的火柴棍数量
match_counts =

def generate_valid_numbers(max_total):
    from collections import deque
    valid = {}
    # 添加0
    if match_counts <= max_total:
      valid = match_counts
    queue = deque()
    # 初始化1-9
    for digit in range(1, 10):
      cnt = match_counts
      if cnt <= max_total:
            valid = cnt
            queue.append((digit, cnt))
    # BFS生成所有合法数字
    while queue:
      num, curr_cnt = queue.popleft()
      for d in range(10):
            new_num = num * 10 + d
            add_cnt = match_counts
            new_total = curr_cnt + add_cnt
            if new_total > max_total:
                continue
            if new_num not in valid:
                valid = new_total
                queue.append((new_num, new_total))
    return valid

n = int(input())
if n < 4 + 2*3:# 最小情况:A=1, B=1, C=2,总火柴2+2+5+4=13
    print(0)
else:
    max_total = n - 4# 总火柴数(A+B+C)
    valid = generate_valid_numbers(max_total)
    count = 0
    numbers = list(valid.keys())
    for a in numbers:
      a_cnt = valid
      for b in numbers:
            b_cnt = valid
            c = a + b
            if c not in valid:
                continue
            total = a_cnt + b_cnt + valid
            if total + 4 <= n:
                count += 1
    print(count)


代码说明
1. generate_valid_numbers函数:用BFS生成所有可能的合法数字,避免前导零。
2. 主逻辑:输入n后,先处理边界情况,再生成合法数字列表,最后枚举所有组合统计符合条件的等式数量。

提示:代码时间复杂度为O(M^2),M为合法数字数量,适用于n较小的情况。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

FishC 发表于 6 天前

琅琊王朝 发表于 2025-04-22 20:27
player-none 发表于 2025-4-19 17:48
题目描述
给你 ...


def count_matches(x):
    # 每个数字对应的火柴棍数量
    digit_matches =
    if x == 0:
      return digit_matches
    s = str(x)
    # 检查前导零
    if len(s) > 1 and s == '0':
      return -1
    total = 0
    for c in s:
      total += digit_matches
    return total

def count_equations(n):
    m = n - 4# A+B+C的火柴总数
    if m < 0:
      return 0
   
    # 预生成有效数字及其火柴数
    max_num = 20000# 经验值,覆盖大部分情况
    valid_numbers = []
    count_map = {}
    for x in range(0, max_num + 1):
      cnt = count_matches(x)
      if cnt != -1:
            valid_numbers.append(x)
            count_map = cnt
   
    res = 0
    for A in valid_numbers:
      cnt_a = count_map
      if cnt_a > m:
            continue
      for B in valid_numbers:
            cnt_b = count_map
            if cnt_a + cnt_b > m:
                continue
            C = A + B
            if C not in count_map:
                continue
            cnt_c = count_map
            if cnt_a + cnt_b + cnt_c == m:
                res += 1
    return res

# 示例输入输出测试
n = int(input())
print(count_equations(n))


思路解析

1. 火柴数映射:每个数字0-9对应的火柴棍数量预先定义,例如1用2根,7用3根。
2. 前导零处理:若数字非零且以0开头(如01),则视为无效。
3. 预处理有效数字:生成所有可能的有效数字(0到20000),并记录它们的火柴棍数量。
4. 双层循环遍历:遍历所有可能的A和B组合,计算C=A+B,检查:
   - A、B、C是否均为有效数字
   - 火柴棍总数是否等于n-4
5. 时间复杂度优化:通过预计算和范围剪枝(如提前跳过超过火柴总数的组合)提升效率。

关键点
- 加号和等号固定消耗4根火柴,因此A+B+C的总火柴数为n-4。
- 数字非零时不能有前导零,例如01非法,但0合法。
- 暴力枚举时需合理设定数字上限(如20000),避免超时。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

player-none 发表于 4 天前

FishC 发表于 2025-4-22 20:45
思路解析

1. 火柴数映射:每个数字0-9对应的火柴棍数量预先定义,例如1用2根,7用3根。


c++
页: [1]
查看完整版本: 火柴棒等式