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

注意:
- 加号与等号各自需要两根火柴棍
- 如果A≠B,则A+B=C与B+A=C视为不同的等式(A,B,C>=0)
- n根火柴棍必须全部用上
输入格式
一个整数n(n<=24)。
输出格式
一个整数,能拼成的不同等式的数目。
输入输出样例
输入 #1
14
输出 #1
2
输入 #2
18
输出 #2
9
我的分析
刚开始做这道题的时候,因为题目标签“搜索”蛊惑,我就真的一根脑经琢磨着用DFS做,后来证明这个做法并不是明智之举。
当时我先定义了一个数组,表示各个数与对应火柴数目的映射关系。因为不确定各个数具体范围是多少,为了保险起见,我的数组大小定义为1001,0-1000下标对应的元素即组成这些数的火柴数目。然后采取DFS的手段枚举所有情况,找出符合条件的所有三个数的组合。
--然而悲催的是,最后Time Limit Exceed!!/(ㄒoㄒ)/~~

我痛定思痛,冷静分析了一波,应该是堆栈调用过多(3层),每次调用又经历一个1000的for循环,电脑遭不住了。(当时想的是3个数嘛,搜索3次嘛,后来才知道这个想法多么愚蠢,因为确定了前两个数,第三个数就是他们的和,自然确定了啊,根本不需要再搜索了,只需要调用两次即可/(ㄒoㄒ)/~~)
正当我心灰意冷,准备放弃时,我耳边突然想起了OI界的神之诫言:“骗分过样例,暴力出奇迹”
于是,我删掉之前的代码,准备用暴力法卷头重来!!(好吧,这应该是贬义词)

我在对之前的不堪入目的算法作出了如下改进,首先我没有再申请了1001大小的数组,而是用一个函数即时计算每一个数对应的火柴数,而这仅仅需要大小为10的数组(用于表示出0-9对应的火柴数),其余数对应的火柴数皆可用函数在此基础上计算出。我把DFS的递归也也换成了双重for循环的暴力迭代,最终代码如下:
#include<iostream>
using namespace std;
//对应0-9的火柴数
int map[10]={6,2,5,5,4,5,6,3,7,6};
//计算某个数对应的火柴数
int match(int n){
//0单独处理
if(n==0) return 6;
int count=0;
//分离该数各位数分别计算火柴数
//然后将火柴数累加
while(n){
count +=map[n%10];
n/=10;
}
return count;
}
int main(){
int n;
cin>>n;
int count=0;
for(int i=0;i<=1000;++i){
for(int j=0;j<=1000;++j){
//因为+,=共占4根火柴,故-4
if(match(i)+match(j)+match(i+j)==n-4)
count++;
}
}
cout<<count<<endl;
return 0;
}
最后,如愿以偿的AC啦!

洛谷P1149.火柴棒等式(暴力搜索)的更多相关文章
- 用Python写算法题--洛谷P1149 火柴棒等式
题目 题目来源 P1149 火柴棒等式,https://www.luogu.org/problem/P1149 题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式? ...
- [NOIP2008] 提高组 洛谷P1149 火柴棒等式
题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自 ...
- 洛谷P1149 火柴棒等式
题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 1.加号与等号 ...
- 洛谷 P1149 火柴棒等式
嗯.... 这道题好讨厌啊!!!! 一开始莫名RE,然后发现数组小了,然后发现后面几个点总是WA,原来推的少了.... 并且这道题的思路真的好水啊!! 先看一下题: 题目描述 给你n根 ...
- (水题)洛谷 - P1149 - 火柴棒等式
https://www.luogu.org/problemnew/show/P1149 一开始还分类重复了.在非0的dfs中居然赋值了0,脑残得一笔. 其实就按 $lead0$ 分类就好了, $lea ...
- Java实现 洛谷 P1149 火柴棒等式
import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.S ...
- 随手练——洛谷-P1151(枚举与暴力搜索)
枚举 #include <iostream> using namespace std; int main() { ; cin >> k; ; i < ; i++) { ) ...
- luogu P1149 火柴棒等式
题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自 ...
- 随手练——洛谷-P1008 / P1618 三连击(暴力搜索)
1.普通版 第一眼看到这个题,我脑海里就是,“我们是不是在哪里见过~”,去年大一刚学C语言的时候写过一个类似的题目,写了九重循环....就像这样(在洛谷题解里看到一位兄台写的....超长警告,慎重点开 ...
随机推荐
- 深入浅出Java并发包—CountDownLauch原理分析 (转载)
转载地址:http://yhjhappy234.blog.163.com/blog/static/3163283220135875759265/ CountDownLauch是Java并发包中的一个同 ...
- 解决android studio Gradle无法同步问题
打开根目录build.gradle buildscript { repositories { // 添加阿里云 maven 地址 maven { url 'http://maven.aliyun.co ...
- Java 继承与抽象类
一.继承 1.概念 在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法. 2.继承的格式&使用 ...
- 2020HDU多校第三场 1005 Little W and Contest
Little W and Contest Time Limit: 2000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/O ...
- 不使用字体图标和图片,只使用css如何做出展开收起的效果
<i class="iconArrow" :class="[ littleNavState === item.meta.id ? 'arrowOpen' : '' ...
- 修改git上传代码的作者姓名
本文参考https://www.cnblogs.com/weiaiqi/p/11842515.html 随着IT行业的不断壮大,开源的东西越来越多,使用git来进行代码管理的人自然也越来越多,而且很多 ...
- pandas巩固
导包 import pandas as pd 设置输出结果列对齐 pd.set_option('display.unicode.ambiguous_as_wide',True) pd.set_opti ...
- php getimagesize 函数 - 获取图像信息
getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息. 语法格式:高佣联盟 www.cgewang.co ...
- 项目积累————关于map的getOrDefault用法
今天在学习领导的编程手法时,注意到了以前没用过的一个方法,那就是map的getOrDefault,看了一下感觉这个方法的用途还是非常广泛的,比如可以实现一个简单的通讯录的功能.下面看我写的一个测试类. ...
- mysqld_multi多实例部署
mysql多实例部署 目录 mysql多实例部署 下载软件 配置用户和组并解压二进制程序至/usr/local下 创建实例数据存放的目录 初始化各实例 配置配置文件/etc/my.cnf 启动各实例 ...