一道很有意思的题目嘞。



这道题目看起来,用搜索似乎无疑了。

我想了这样一个办法(看了很多博客似乎都没用这种方法),可能是觉得太麻烦了吧:

1、我们先把0到9的数字排列,找出排列消耗火柴等于0的序列。这就是dfs函数的作用。

2、将找出的序列传入check函数中,枚举第一个数的长度,在枚举第二个数的长度,然后检查a+b是否等于c。

3、关键是,要满足非个位数不能为0,就是这个语句了。



其中d[0]记录第一个数的长度,d[1]记录第二个数的长度,num表示序列总长度。

代码如下:

#include <bits/stdc++.h>
using namespace std;
int a[13]={6,2,5,5,4,5,6,3,7,6};
int b[100],d[4];//数组b储存序列,数组d储存第
一个数和第二个数的长度
int n,sumn=0;
void check(int num,int pos,int gg)//num为从dfs传来的序列长度,上一个数的长度截止到pos,gg表示已经匹配的数-1。
{
if(gg==2)
{
int q=0,w=0,e=0;
if(d[0]>=1&&b[0]==0)
return;
if(d[1]-d[0]>1&&b[d[0]+1]==0)
return;
if(num-d[1]>1&&b[d[1]+1]==0)
return;
for(int i=0;i<=d[0];i++)
q=q*10+b[i];
for(int i=d[0]+1;i<=d[1];i++)
w=w*10+b[i];
for(int i=d[1]+1;i<=num;i++)
e=e*10+b[i];
if(q+w==e)
{
sumn++;
}
return;
}
for(int i=pos;i<num;i++)
{
d[gg]=i;
check(num,i+1,gg+1);
d[gg]=0;
}
}
void dfs(int n,int num)
{
if(n==0)
{
check(num-1,0,0);
return;
}
if(n<2)
return;
for(int i=0;i<=9;i++)
{
if(n>=a[i])
{
b[num]=i;
dfs(n-a[i],num+1);
b[num]=0;
}
}
}
int main()
{
cin>>n;
sumn=0;
dfs(n-4,0);
cout<<sumn<<endl;
}

当然,递归写法还有一种,我给个链接大家自己看吧,

纯递归写法

但是,这题有更简单的方法。

我们直接从用两个for循环枚举a和b



其中cal为计算数字需要消耗的火柴数目。为什么上限取到1111呢?题目中火柴只有24根,可用的只有20根。1111需要8根火柴,0需要5根,若满足a+b=c,c也为1111,这里加起来21根。所以在范围内,我们都可以枚举到。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int num[11] = {6,2,5,5,4,5,6,3,7,6},n,ans = 0;
int find3(int x)
{
if(x == 0)
return 6;
int an = 0;
while(x)
{
an += num[x % 10];
x /= 10;
}
return an;
}
void find2(int cnt,int a,int x,int k)//第二位数;
{
if(find3(a + x) == cnt)
ans ++;
if(k)//避免首位数为0;
for(int i = 0;i <= 9;i ++)
{
if(cnt - num[i] >= 2)//至少还要放1个1;
find2(cnt - num[i],a,x * 10 + i,1);
}
}
void find(int cnt,int x,int k)//第一位数;
{
for(int i = 0;i <= 9;i ++)
if(n - num[i] >= 2)
find2(cnt - num[i],x,i,i);
if(k)//避免首位数为0;
for(int i = 0;i <= 9;i ++)
{
if(cnt - num[i] >= 4)
find(cnt - num[i],x * 10 + i,1);
}
}
int main()
{
scanf("%d",&n);
n -= 4;// ‘+’ 和 ‘=’;
for(int i = 0;i <= 9;i ++)
if(n - num[i] >= 4)//至少还要放2个1;
find(n - num[i],i,i);
printf("%d",ans);
}

洛谷p1149的更多相关文章

  1. 洛谷 P1149 火柴棒等式

    嗯....   这道题好讨厌啊!!!!   一开始莫名RE,然后发现数组小了,然后发现后面几个点总是WA,原来推的少了....   并且这道题的思路真的好水啊!!   先看一下题: 题目描述 给你n根 ...

  2. (水题)洛谷 - P1149 - 火柴棒等式

    https://www.luogu.org/problemnew/show/P1149 一开始还分类重复了.在非0的dfs中居然赋值了0,脑残得一笔. 其实就按 $lead0$ 分类就好了, $lea ...

  3. 用Python写算法题--洛谷P1149 火柴棒等式

    题目 题目来源 P1149 火柴棒等式,https://www.luogu.org/problem/P1149 题目描述 给你n根火柴棍,你可以拼出多少个形如"A+B=C"的等式? ...

  4. 洛谷P1149 火柴棒等式

    题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 1.加号与等号 ...

  5. [NOIP2008] 提高组 洛谷P1149 火柴棒等式

    题目描述 给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A.B.C是用火柴棍拼出的整数(若该数非零,则最高位不能是0).用火柴棍拼数字0-9的拼法如图所示: 注意: 加号与等号各自 ...

  6. Java实现 洛谷 P1149 火柴棒等式

    import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.S ...

  7. 洛谷P1149.火柴棒等式(暴力搜索)

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

  8. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  9. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

随机推荐

  1. Linux C++ 网络编程学习系列(1)——端口复用实现

    Linux C++ 网络编程学习系列(1)--端口复用实现 源码地址:https://github.com/whuwzp/linuxc/tree/master/portreuse 源码说明: serv ...

  2. Java成长记录第二集--基础重点

    第一篇写的博客给自己的学习路线立了个flag后,感觉现在学习的积极性大增,这也离不开那几位老铁们的互相鼓励.废话不多说,现在给出自己总结的Java基础部分所要重点注意的内容,对以后的开发工作也是很常用 ...

  3. 10个步骤教你如何安装Anaconda安装,Python数据分析入门必看

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:小白 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行 ...

  4. js拼接onclick方法字符串参数解决方法

    onclick = contentmap("'+useridarr[i]+'")

  5. google无法播放mp4 chrome无法播放h264

    写在前面 我在chrome上无法播放h264+Acc的mp4,在firefox.ie都可以播放,而且此mp4在vlc终可以正常播放. 视频链接:http://106.14.221.185:7001/p ...

  6. Mybatis源码详解系列(四)--你不知道的Mybatis用法和细节

    简介 这是 Mybatis 系列博客的第四篇,我本来打算详细讲解 mybatis 的配置.映射器.动态 sql 等,但Mybatis官方中文文档对这部分内容的介绍已经足够详细了,有需要的可以直接参考. ...

  7. Service Mesh 介绍

    传统单体应用的局限性说明 传统单体应用代码体量庞大繁杂,不利于理解,也不利于团队合作开发,更不利于频繁更新和部署,增加服务宕机的风险. 耦合性高,功能代码块之前很容易造成强依赖,只要其中任何一个代码逻 ...

  8. thinkphp5--关于多条件查询的分页处理问题

    首先,我们要想搞明白,我们的分页参数起作用的原理: 正在使用的时候的语法: if(!empty($seach)){ $where['user_name|mobile'] = ['like','%'.$ ...

  9. JAVA企业级应用TOMCAT实战(三)

    JVM优化涉及到两大方面我个人的理解 .如何分配JVM的内存空间 .我应该使用什么垃圾回收器 JVM产生的垃圾需要回收.回收有不同的回收器. JVM的调优需要了解各个垃圾回收机制的原理. 终极目标:降 ...

  10. union 的概念及在嵌入式编程中的应用

    union 概念 union 在中文的叫法中又被称为共用体,联合或者联合体,它定义的方式与 struct 是相同的,但是意义却与 struct 完全不同,下面是 union 的定义格式: union ...