洛谷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语言的时候写过一个类似的题目,写了九重循环....就像这样(在洛谷题解里看到一位兄台写的....超长警告,慎重点开 ...
随机推荐
- scratch编程滑雪者游戏教程
首先我们来看一下效果: 我们从演示中能看出4个角色:企鹅.大树.旗子和装饰用的坎,我们通过键盘操控企鹅滑雪躲避树并捡起旗子,现在我们就来看看是怎么编的吧! 首先我们要画 ...
- C++语法小记---面向对象模型(实例的内存分布)
面向对象的模型(内存分布) 对于一个对象而言,成员变量和成员函数是分开存放的 成员函数位于代码段,所有的类对象共有 成员变量为每一个对象独有,位于内存中 类对象在内存中的分布和struct完全相同 对 ...
- Linux指令,更新中
Linux指令 ls 列举文件. ls *.txt:列举所有txt后缀的文件夹. touch 创建文件. $ touch asd.txt fgh.txt $ touch love{1..10}shiy ...
- Django安装与简单配置(1)
目录 1. 环境准备 2. 开始安装 2.1 安装Django 2.2 安装 Mysql数据库 3. 开始配置 3.1 Django简单配置 3.1.1 创建一个工程(project)为devops: ...
- sed 指定行范围匹配
sed -n '5,10{/pattern/p}' file sed是一个非交互性性文本编辑器,它编辑文件或标准输入 导出的文件拷贝.标准输入可能是来自键盘.文件重定向.字符串或变量,或者是一个管道文 ...
- 关于RecyclerView(二)设置EmptyView
首先重写一个RecyclerView类 package com.onepilltest.others; import android.content.Context; import android.s ...
- phpbasic
<!DOCTYPE html> <html> <body> <?php // 这是 PHP 单行注释 /* 这是 PHP 多行 注释 */ ?> < ...
- Python os.fdopen() 方法
概述 os.fdopen() 方法用于通过文件描述符 fd 创建一个文件对象,并返回这个文件对象.高佣联盟 www.cgewang.com Unix, Windows上可用. 语法 fdopen()方 ...
- PHP soundex() 函数
实例 计算 "Hello" 的 soundex 键: <?php高佣联盟 www.cgewang.com$str = "Hello";echo sound ...
- PDO::setAttribute
PDO::setAttribute — 设置属性(PHP 5 >= 5.1.0, PECL pdo >= 0.1.0) 说明 语法 bool PDO::setAttribute ( int ...