暴力枚举——火柴棒等式

暴力枚举——火柴棒等式

题目描述

给你n根火柴棍,你可以拼出多少个形如 “A + B = C” 的等式?等式中的 A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0)。用火柴棍拼数字 0 - 9 的拼法如图所示:
在这里插入图片描述
注意:
1.加号与等号各自需要两根火柴棍。
2.如果 A 不等于 B,则 A + B = C 与 B + A = C 视为不同的等式(A,B,C >= 0)
3.n 根火柴棍必须全部用上

输入格式

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

输出格式

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

输入输出样例

输入样例 1

14

输出样例 1

2

输入样例 2

18

输出样例 2

9

说明/提示

【输入输出样例1解释】

2 个等式为 0 + 1 = 1 和 1 + 0 = 1。

【输入输出样例2解释】

9 个等式为:
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int f[10]={6,2,5,5,4,5,6,3,7,6};	// 数字 0~9 对应的火柴棍数 

int tot(int x)	// 计算每个数由多少根火柴棍组成 
{
	int total=0;
	do{
		total+=f[x%10];
		x/=10;
	}while(x);
	return total;
} 

int main()
{
	
	int n;
	cin>>n;
	n=n-4;	// 减去 '+' 和 '=' 所需的火柴棍数 
	int a,b,cnt=0;
	for(a=0;a<1000;a++){
		for(b=0;b<1000;b++){
			if(tot(a)+tot(b)+tot(a+b)==n)
				cnt++;
		}
	}
	cout<<cnt<<endl;
	return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个问题可以用递归或回溯的方式来解决。首先将等式转换为一个字符串,例如 "1+2=3" 就可以转换为 "1+2=3#",其中 "#" 表示字符串的结束符。 然后可以定义一个函数,该函数的输入为一个字符串和两个整数 a 和 b,表示当前字符串中 a 和 b 之间的部分需要判断是否成立。函数的递归终止条件为当字符串中没有剩余的火柴时,判断 a+b 是否等于 c。如果等于,则返回 True,否则返回 False。 在函数中,可以使用一个循环来枚举当前字符串中 a 和 b 之间的火柴个数 i,然后分别计算 a 和 b 对应的数字。如果当前字符为 "+",则将 a 和 b 对应的数字相加;如果当前字符为 "=",则判断 a+b 是否等于 c。如果等于,则返回 True;否则继续递归判断接下来的字符串部分。 下面是一个简单的 Python 代码实现: ``` def is_equation_valid(equation): equation += '#' # 添加字符串结束符 def helper(s, a, b): if not s: # 火柴用完了,判断 a+b 是否等于 c return a + b == c for i in range(1, len(s)): if s[i] == '+': if helper(s[i+1:], a+count(s[:i]), b): return True if helper(s[i+1:], a, b+count(s[:i])): return True elif s[i] == '=': if helper(s[i+1:], a+count(s[:i]), b): return a + b == c return False def count(s): return sum([sticks[c] for c in s]) sticks = {'0': 6, '1': 2, '2': 5, '3': 5, '4': 4, '5': 5, '6': 6, '7': 3, '8': 7, '9': 6} a, b, c = [count(x) for x in equation.split('=')] return helper(equation, 0, 0) ``` 其中,sticks 字典用于将数字字符映射到对应的火柴个数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值