UVa 817 According to Bartjens 数字表达式 DFS ID 迭代加深搜 逆波兰表达式
题目链接:According to Bartjens
题目描述:
给定一个由数字和一个===组成的字符串,你需要在数字之间添加+,−,∗+,-,*+,−,∗三种符号,在保证表达式合法的情况下(同时形成的新的数字不能有前导零),使表达式的结果等于200020002000,输出所有可能的添加方案(你至少要添加一个符号),按照字典序从小到大进行输出。
例如2100100=2100100=2100100=的解如下:
题解:
本题只知道至少添加一个符号,所以我们需要依次枚举添加一个、两个、三个一直到n−2n-2n−2个(nnn为表达式的长度),然后使用DFSDFSDFS尝试在每个位置放置符号,放置的时候需要注意不能出现含有前导零的数字,保证不出现前导零有两种方案:
- 枚举所有位置,在最后进行检查的时候判断出现在计算符号之后的数字以000开头但是位数大于111;
- 在搜索的过程中进行判断,假定搜索到位置pospospos如果当前位置是000那么当前位置的后面只能放置非数字符号;
如何计算表达式的值?可以使用逆波兰表达式,具体的使用两个栈,一个用来保存数字,一个用来保存符号,符号站里面的符号的优先级要保证递增:
- 遇到数字则直接加入数字栈;
- 遇到符号的时候,检查符号与符号栈栈顶的符号的优先级,如果栈顶的符号优先级较高或相等,那么则应该弹出栈顶的符号进行一次计算,直到符号栈为空,或者栈顶的符号优先级较低,再将当前的符号入栈;
- 最后弹出符号栈里面的所有符号依次进行计算。
代码:
#include <bits/stdc++.h>const int NaN = 0x3f3f3f3f;
const int OPERATOR_NUM = 3;using namespace std;int maxDepth, caseID;
string expression, now;
char ope[] = "*+-";
vector<string> ans;// 比较两个运算符的优先级
int cmp(char op1, char op2)
{if (op1 == op2) { return 0; }if (op1 == '*') { return 1; }if (op2 == '*') { return -1; }return 0;
}// 计算两个数的和、差或者积
int calculate(int lhs, char ope, int rhs)
{if (ope == '+') { return lhs + rhs; }if (ope == '-') { return lhs - rhs; }return lhs * rhs;
}bool check()
{int num = NaN, lhs = 0, rhs = 0;stack<int> number;stack<char> ops;for (int i = 0; i < now.length() - 1; i++) {if (isdigit(now[i])) {if (num == NaN) { num = 0; }num = num * 10 + now[i] - '0';} else {number.push(num);while (!ops.empty() && cmp(ops.top(), now[i]) >= 0) {rhs = number.top(); number.pop();lhs = number.top(); number.pop();number.push(calculate(lhs, ops.top(), rhs));ops.pop();}ops.push(now[i]);num = NaN;}}if (num != NaN) { number.push(num); }while (!ops.empty()) {rhs = number.top(); number.pop();lhs = number.top(); number.pop();num = calculate(lhs, ops.top(), rhs); ops.pop();number.push(num);}return number.top() == 2000;
}void dfs(int nowDepth, int pos)
{if (nowDepth == maxDepth) {int tempLen = now.length();int increment = expression.length() - pos;now.append(expression.substr(pos, increment));if (check()) { ans.push_back(now); }now.erase(tempLen, increment);return;}if (maxDepth - nowDepth > expression.length() - 2 - pos) { return; }for (int i = pos; i < expression.length() - 2; i++) {// 这里是保证最后一个数字不含有前导零if (nowDepth == maxDepth - 1 && expression[i + 1] == '0' && expression[i + 2] != '=') { continue; }for (int j = 0; j < OPERATOR_NUM; j++) {int tempLen = now.length();int increment = i - pos + 1 + 1;now.append(expression.substr(pos, i - pos + 1));now.push_back(ope[j]);dfs(nowDepth + 1, i + 1);now.erase(tempLen, increment);}// 这里保证当前数字不含前导零,当前数字如果是以0开头那么不能继续进行拼接if (expression[pos] == '0') { break; }}
}int main()
{while (cin >> expression) {ans.resize(0);now = "";if (expression[0] == '=') { break; }for (maxDepth = 1; maxDepth < expression.length() - 1; maxDepth++) { dfs(0, 0); }caseID++;cout << "Problem " << caseID << endl;sort(ans.begin(), ans.end());for (auto str : ans) { cout << " " << str << endl; }if (ans.size() == 0) { cout << " IMPOSSIBLE" << endl; }}return 0;
}
相关文章:
UVa 817 According to Bartjens 数字表达式 DFS ID 迭代加深搜 逆波兰表达式
题目链接:According to Bartjens 题目描述: 给定一个由数字和一个组成的字符串,你需要在数字之间添加,−,∗,-,*,−,∗三种符号,在保证表达式合法的情况下(同时形成的新的数字不能有前导零),使表…...
c++基础/类和对象
c基础 2.1名字空间 namespace 防止命名冲突 说明:名字空间可以在全局作用域或其他作用域(另一个名字空间)内部定义,但不能在函数或类的内部定义。 使用: #include<iostream> using namespace std; //std中包…...
2023年中国人工智能产业趋势报告
易观:尽管2022年人工智能市场发展活跃度不及预期,但2022年对人工智能产业来说无疑是令人激动的一年。年中由DALL-E 2以及其后Stable Diffusion和Midjourney等文本-图像生成模型引起公众对人工智能生成内容的大量关注,年末ChatGPT的横空出世刷…...
STM32定时器的配置,解析预分频系数和重装载值与时钟频率的关系
🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - 蓝…...
解决Sql WorkBench中数据库不能重命名的问题
解决Sql WorkBench中数据库不能重命名的问题mysql不支持直接重命名数据库1. 连接到数据库2. 打开菜单,选择迁移向导3. 点击Start Migration4. 填写源数据库的相应参数5. 填写目标数据库的响应参数6. 稍等片刻,点击Next7. 选择你要迁移的数据库。8. 进入一…...
REFL: 联邦学习中智能的设备选择方法
原创 齐天宇 隐私计算研习社 收录于合集#联邦学习54个现有的FL方案使用随机的参与者选择来提高选择过程的公平性,但是这会导致资源的低效利用和较低的训练质量。本文系统地解决了FL中资源效率低效的问题,展示了智能参与者选择和合并来自落后参与者的更新…...
Linux:NFS服务器
目录NFS服务器的介绍例NFS服务器的介绍 1,NFS(网络文件系统),主要用于服务器分享提供文件或文件系统等服务,与其他服务器有所不同,主打的是分享,所以没有配置文件,只需要在 /etc/ex…...
电子技术——数字逻辑反相器
电子技术——数字逻辑反相器 在学习完如何通过CMOS数字电路实现组合逻辑,接下来我们评估这种数字CMOS电路的性能。首先,我们考虑最基本的部件——反相器。 电压传导特性 下图是一个反相器的原理图: 在之前,我们已经介绍了MOSFE…...
python的多线程编程之锁
1、 背景概述 在上篇文章中,主要讲述了python中的socket编程的一些基本方面,但是缺少关于锁的相关概念,从而在这篇文章中进行补充。 由于在python中,存在了GIL,也就是全局解释器锁,从而在每次进行获得cpu的…...
Android Framework-进程间通信——Binder
我们知道,同一个程序中的两个函数之间能直接调用的根本原因是处于相同的内存空间中。 比如有以下两个函数A和B: /*Simple.c*/ void A() { B(); } void B() { }因为是在一个内存空间中,虚拟地址的映射规则完全一致,所以函数A和B之…...
有趣的小知识(二)浏览器内的秘密:了解Cookie基础知识
一、简介 Cookie是一种小型的文本文件,由Web服务器发送给Web浏览器,并存储在用户的计算机硬盘上。它通常用于记录用户的偏好、登录状态、购物车信息等,以便在用户下次访问该网站时能够提供更好的用户体验。Cookie通常包含网站的名称、Cookie的…...
Spring框架
DI:依赖注入IOC:控制反转AOP:面向切面IOC容器:存放管理各种对象Spring优势:低耦合。(降低组件之间的关联性,实现软件各层之间的解耦)声明式事务管理(基于AOP来管理)和其他框架的整合(…...
mysql8的表锁排查
information_schema.innodb_trx ##正在运行的事务信息。 sys.innodb_lock_waits ##处于锁等待的关联事务信息。 performance_schema.threads ##SQL线程及线程号、进程号、OS线程号等信息 # 查询锁的情况 select * from performance_schema.data_locks where object_name =t_xxx…...
【C语言】深度理解指针(上)
前言🌊谈到指针,想必大家都不陌生。它不仅是C语言的重难点,还是不少C初学者的噩梦。本期我们将深度探讨一些较为复杂的指针以及指针的妙用,带领大家感受指针的魅力😝。首先,我们先来复习复习指针的概念&…...
最近我的视频播放浅学总结
因为想做一个类似苹果的同播共享功能,这一段时间对音视频做了一些浅浅的学习,现简单总结记录。 我的需求是找到一个尽可能简单的方案来两人播放一段视频,并且能够进度和操作同步,所以基本不能有延迟,同时能够显示WebV…...
【C/C++基础知识点】输出n位斐波那契数列
目录 前言什么是斐波那契数列兔子的故事小知识点收尾前言 在软件行业已经有快十年,技术虽然一般般,但是足够应付额解决编程入门的相关问题! 都说十年磨一剑,积累到一定经验,是时候发挥自己的价值,给予入门的同行些许的帮助! 为什么要写收费专栏,其实原因很简单,时间就…...
C语言拔高知识——指针的进阶(万字大文超详细)
在之前的文章中,我已经讲解过了初阶指针的内容,今天就来讲一讲指针的进阶! 上篇指针地址:保姆式指针讲解,超详细,适合初学者_指针详解_陈大大陈的博客-CSDN博客 目录 1. 字符指针 2. 指针数组 3. 数组指…...
程序员推荐的良心网站合集!(第二期)
今天来给大家推荐几个程序员必看的国外良心网站合集第二期合集。 Semantic Schoolar 由微软联合创始人Paul Allen开发的免费学术搜索引擎,不仅可以通过时间线快速定位想要的文献,还有强大的筛选功能可以精准的找到自己想要的文献,想要什么搜…...
【Java核心知识】spring boot整合Mybatis plus + Phoenix 访问Hbase与使用注意
为了Phoenix能让开发者通过SQL访问Hbase而不必使用原生的方式?引用Phoenix官网上的一句话:SQL is just a way of expressing what you want to get not how you want to get it. 即SQL不是一种数据操作技术,而是一种特殊的表达方式。只是表示…...
lua实现游戏全局鼠标点击效果
前言 最近在优化项目,策划提了一个需求,需要实现一个通用点击特效。 尝试1 首先想到的是改变鼠标指针样式,这个以前学过,还有点印象,以前刚开始学unity的时候,记得看到过一个方法可以改变游戏中鼠标指针样式。 方法如下:选择“Edit”——>“Project Setting”,打…...
MyBatis源码分析(二、续)SqlSource创建流程,SQL如何解析?如何将#{id}变成?的
文章目录实例一、SqlSource处理入口二、SqlSource处理逻辑1、XMLScriptBuilder 构造方法2、解析动态sql3、DynamicSqlSource4、RawSqlSource解析sql(1)parse方法解析sql写在后面实例 此处我们分析的sql: <select id"selectBlog&quo…...
用 C 语言开发一门编程语言 — 函数库的设计与实现
目录 文章目录目录前言前文列表基础功能演示数字运算变量与代数运算列表处理Lambda 函数条件分支字符串源文件加载函数库列表处理函数库条件分支函数库数学库前言 通过开发一门类 Lisp 的编程语言来理解编程语言的设计思想,本实践来自著名的《Build Your Own Lisp》…...
网络层IP协议与数据链路层以太网协议
文章目录一、IP协议IP地址地址管理路由选择DNS二、以太网协议以太网帧MTU一、IP协议 IP协议是我们网络层的代表协议,今天我们就来一起学习一下吧,我们这里介绍的主要是IPv4协议。 版本:指定IP协议的版本,版本的取值只有4&#x…...
JDK动态代理详解
1.什么是动态代理 可能很多小伙伴首次接触动态代理这个名词的时候,或者是在面试过程中被问到动态代理的时候,不能很好的描述出来,动态代理到底是个什么高大上的技术。不方,其实动态代理的使用非常广泛,例如我们平常使用…...
实时的软件生成 —— Prompt 编程打通低代码的最后一公里?
PS:这也是一篇畅想,虽然经过了一番试验,依旧有一些不足,但是大体上站得住脚。传统的软件生成方式需要程序员编写大量的代码,然后进行测试、发布等一系列繁琐的流程。而实时生成技术则是借助人工智能技术,让…...
互联网工程师 1480 道 Java 面试题及答案整理 ( 2023 年 整理版)
最近很多粉丝朋友私信我说:熬过了去年的寒冬却没熬过现在的内卷;打开 Boss 直拒一排已读不回,回的基本都是外包,薪资还给的不高,对技术水平要求也远超从前;感觉 Java 一个初中级岗位有上千人同时竞争&#…...
Spark开发
第一步:创建RDD Spark提供三种创建RDD方式:** 集合、本地文件、HDFS文件** 使用程序中的集合创建RDD,主要用于进行测试,可以在实际部署到集群运行之前,自己使用集合构造一些测试数据,来测试后面的spark应…...
Tornado异步框架
简介: tornado是Python的web框架。tornado和主流的web服务器框架有明显的区别:它是非阻塞式服务器,而且速度非常快,得力于其非阻塞的方式和epoll的运用tornado可以每秒处理数以千计的连接(号称) 基本配置 …...
openpnp - error - 吸嘴没下降到板子上, 就将元件松开
文章目录openpnp - error - 吸嘴没下降到板子上, 就将元件松开概述笔记ENDopenpnp - error - 吸嘴没下降到板子上, 就将元件松开 概述 以前用过国内一家openpnp厂家出的设备, 他们家的openpnp是自己改过的. 贴片流程已经走过一遍. 这次还是按照以前记录的笔记, 按照国内那家的…...
【Java】yyyy-MM-dd HH:mm:ss 时间格式 时间戳 全面解读超详细
时间格式 时间格式(协议)描述gg时期或纪元。y不包含纪元的年份。不具有前导零。yy不包含纪元的年份。具有前导零。yyyy包含纪元的四位数的年份。M月份数字。一位数的月份没有前导零。MM月份数字。一位数的月份有一个前导零。MMM月份的缩写名称,在AbbreviatedMonthN…...
wordpress炫酷背景图片/今天株洲最新消息
A aabs 绝对值、模、字符的ASCII码值acos 反余弦acosh 反双曲余弦acot 反余切acoth 反双曲余切acsc 反余割acsch 反双曲余割align 启动图形对象几何位置排列工具all 所有元素非零为真angle 相角ans 表达式计算结果的缺省变量名any 所有元素非全零为真area 面域图argnames 函数M…...
注册网站名字/什么是seo教程
1、POJO: POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。 使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接。其中有一些属性及其getter setter方法…...
专业做网站优化需要多久/seo排名优化的网站
一。web\resource\components\ueditor\dialogs\attachment\attachment.js 二、web\resource\components\ueditor\dialogs\image\image.js 三、 添加一下代码 // 对上传成功后的图片按照选择的顺序进行排序var initImags uploadImage.uploader.getFiles() // 获取选择的所有文…...
建设银行永泰支行网站/岳阳网站建设推广
本文是关于重载单目运算符的实战讲解,用两个例子进行说明。理论不多,重在理解前置和后置的区别。在看本文之前,您需要了解运算符的重载的基本概念。如果不懂,也没关系,请进下面的传送门。 浅显易懂的C运算符重载 理论…...
wordpress中文tag/seo外包杭州
一、引子顾名思义,进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。所…...
网站是由多个网页组成的吗/360优化大师app
b ,B,KB,MB,GB之间的关系 utf-8种一个字母或者 数字等于一个字节(B) , 一个汉字等于3个字节(B),表情等于4个字节(B) b 比特bit / 位 …...