洛谷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语言的时候写过一个类似的题目,写了九重循环....就像这样(在洛谷题解里看到一位兄台写的....超长警告,慎重点开 ...
随机推荐
- CENTOS下搭建git代码仓库 ssh协议
centos服务器下搭建git仓库,使用ssh协议管理仓库代码权限 git官网(http://git-scm.com/) 使用ssh协议: 一.安装git,使用yum install git 或 ...
- 干货分享:Python Web 部署方式大全
不要让服务器裸奔 学过PHP的都了解,php的正式环境部署非常简单,改几个文件就OK,用FastCgi方式也是分分钟的事情.相比起来,Python在web应用上的部署就繁杂的多,主要是工具繁多,主流服 ...
- 给咱的服务器安装BBR脚本
yum -y install wget ##ContOS Yum 安装 wget apt-get install wget ##Debian Ubuntu 安装 wget 先给咱的服务器安装wget, ...
- 【几何+模拟】二次元变换 计蒜客 - T3213
题目 aslky 有一个 n×n 的矩形,每个位置上都有一个数,有 q 次操作,每次他会让你上下翻转 (UD),左右反转 (LR),顺时针旋转 90∘(SZ),逆时针旋转 90∘(NZ),请你输出最后 ...
- git命令常用操作
第一步:拉取git上的文件(git clone 远程仓库地址) 第二步:在主目录下运行git base here,执行git status 第三步:添加文件到本地仓库(git add 文件)之后,再次 ...
- 报错:invalid operands to binary - (have ‘int’ and ‘char *’)
//这个题是输入大写的一串字符,然后按A对应1...这个规律求乘积 char a[],b[]; scanf("%s",a); scanf("%s",b); in ...
- 老男孩武老师的Django笔记
武老师的 Django 博客笔记 基础篇 https://www.cnblogs.com/wupeiqi/articles/5237704.html 进阶篇 https://www.cnblogs.c ...
- PHP array_shift() 函数
实例 删除数组中的第一个元素(red),并返回被删除的元素: <?php $a=array("a"=>"red","b"=> ...
- PHP array_product() 函数
实例 计算并返回数组的乘积: <?php$a=array(5,5);echo(array_product($a));?> 运行实例 » 定义和用法 array_product() 函数计算 ...
- PHP timezone_identifiers_list() 函数
------------恢复内容开始------------ 实例 输出非洲的所有时区: <?phpprint_r(timezone_identifiers_list(1));?> 运行实 ...