UVa 817 According to Bartjens 数字表达式 DFS ID 迭代加深搜 逆波兰表达式

news2024/11/25 22:34:30

题目链接:According to Bartjens
题目描述:

给定一个由数字和一个 = = =组成的字符串,你需要在数字之间添加 + , − , ∗ +,-,* +,,三种符号,在保证表达式合法的情况下(同时形成的新的数字不能有前导零),使表达式的结果等于 2000 2000 2000,输出所有可能的添加方案(你至少要添加一个符号),按照字典序从小到大进行输出。
例如 2100100 = 2100100= 2100100=的解如下:
在这里插入图片描述

题解:

本题只知道至少添加一个符号,所以我们需要依次枚举添加一个、两个、三个一直到 n − 2 n-2 n2个( n n n为表达式的长度),然后使用 D F S DFS DFS尝试在每个位置放置符号,放置的时候需要注意不能出现含有前导零的数字,保证不出现前导零有两种方案:

  • 枚举所有位置,在最后进行检查的时候判断出现在计算符号之后的数字以 0 0 0开头但是位数大于 1 1 1
  • 在搜索的过程中进行判断,假定搜索到位置 p o s pos pos如果当前位置是 0 0 0那么当前位置的后面只能放置非数字符号;

如何计算表达式的值?可以使用逆波兰表达式,具体的使用两个栈,一个用来保存数字,一个用来保存符号,符号站里面的符号的优先级要保证递增:

  • 遇到数字则直接加入数字栈;
  • 遇到符号的时候,检查符号与符号栈栈顶的符号的优先级,如果栈顶的符号优先级较高或相等,那么则应该弹出栈顶的符号进行一次计算,直到符号栈为空,或者栈顶的符号优先级较低,再将当前的符号入栈;
  • 最后弹出符号栈里面的所有符号依次进行计算。

代码:

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java工具jconsole/jstat学习

参考视频【java】jvm指令与工具jstat/jstack/jmap/jconsole/jps/visualVM_哔哩哔哩_bilibili 一、jps 我们再windows和linux都可以看到哪些java进程。 有小伙伴又会问了 这个类是java的 那其他的这么多进程18096 /8685 这些是啥啊 其实也是java进程&#xff0c;只不过是其他程…

23.3.1调研

上一篇调研之后&#xff0c;还是没有思路&#xff0c;继续调研文献。 文章目录WEAKLY SUPERVISED EXPLAINABLE PHRASALREASONING WITH NEURAL FUZZY LOGIC模型结构ASK ME ANYTHING: A SIMPLE STRATEGY FOR PROMPTING LANGUAGE MODELSHumanly Certifying Superhuman Classifiers…

即时通讯和实时通讯的区别

即时通讯&#xff08;IM&#xff09;和实时通讯是一套网络通讯系统&#xff0c;其本质都是对信息进行转发。最大的不同点是对信息传递的时间规定。二者的区别可以从以下几个方面&#xff1a;一、场景常见的即时通讯 场景包括文字聊天、语音消息发送、文件传输、音视频播放等。通…

【RocketMQ】消息的刷盘机制

刷盘策略 CommitLog的asyncPutMessage方法中可以看到在写入消息之后&#xff0c;调用了submitFlushRequest方法执行刷盘策略&#xff1a; public class CommitLog {public CompletableFuture<PutMessageResult> asyncPutMessage(final MessageExtBrokerInner msg) {// …

docker(一)简介、环境搭建

文章目录前言一、docker简介1.什么是docker2. 什么是容器3.传统的虚拟化技术和容器之间的差别4.容器是如何运行的二、docker环境部署及测试1.环境部署&#xff1a;2.通过镜像运行容器3.拉取镜像前言 一、docker简介 1.什么是docker Docker是一个开源的应用容器引擎&#xff0…

TDEngine集群监控组件安装配置(Telegra+Grafana方案)

Tdengine的监控指标包括以下几个方面&#xff1a; 系统指标&#xff1a;CPU使用率、内存使用率、磁盘空间、网络流量等。数据库指标&#xff1a;连接数、查询数、写入数、读取数等。SQL指标&#xff1a;执行时间、执行计划、索引使用情况等。集群指标&#xff1a;节点状态、数…

生命周期:Vue,微信小程序

目录 一、vue2生命周期&#xff08;钩子函数&#xff09; 二、vue3生命周期&#xff08;钩子函数&#xff09; 三、vue-router3钩子函数&#xff08;与vue2匹配&#xff09; 1、全局钩子&#xff08;全局守卫&#xff09; 2、路由内钩子&#xff08;路由独享的守卫&#x…

Python3-字典

Python3 字典 字典是另一种可变容器模型&#xff0c;且可存储任意类型对象。 字典的每个键值 key>value 对用冒号 : 分割&#xff0c;每个对之间用逗号(,)分割&#xff0c;整个字典包括在花括号 {} 中 ,格式如下所示&#xff1a; d {key1 : value1, key2 : value2, key3…

HTTP头注入

HTTP头注入HTTP Header概述HTTP报文类型HTTP请求方法HTTP Header内容HTTP Header注入HTTP Header注入实例User-Agent注入XFF注入HTTP Header概述 HTTP报文类型 请求报文&#xff1a;由客户端发送给服务器的消息&#xff0c;其组成包括请求行&#xff0c;请求头和请求体。响应…

区块链安全正当时|《Hyperledger Fabric2.0架构安全报告》解读

2021年&#xff0c;《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》将区块链纳入数字产业&#xff0c;对其发展作出了重要部署。同年6月中央网信办和工信部联合印发了《关于加快推动区块链技术应用和产业发展的指导意见》&#xff0c;提出加快区块链…

Babel-好文

ES6的很多语法在浏览器甚至node环境中无法执行&#xff0c;babel就是一个广泛使用的转码器&#xff0c;可以将ES6代码转化成ES5代码定义一个文件夹&#xff0c;cmd进入到其中&#xff0c;运行npm install -g babel-cli安装&#xff0c;然后可以通过babel --version查看是否安装…

odoo15 登录界面的标题自定义

odoo15 登录界面的标题自定义 原代码中查询:<title>Odoo<title> <html> <head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>Odoo</title><link rel="shortcut icon…

Jvm调优实战笔记

一、基础命令jps 查看所有java进程jinfo 进程号 查看该线程相关信息3、jstat 统计信息&#xff08;数据跟踪信息&#xff09;jstat -gc 进程号 查看该线程在内存中每一块占用的大小jstat -gc 进程号 时间&#xff08;毫秒&#xff09; 更新频率4、jstack 跟踪线程jstack 进程号…

Ethercat系列(10)用QT实现SOEM主站

首先将SOEM编译成静态Lib库可以参考前面的博文(83条消息) VS2017下编译SOEM(Simle Open EtherCAT Master)_soem vs_CoderIsArt的博客-CSDN博客make_libsoem_lib.bat "C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build" x86用QT创建…

【C++】多态虚表

多态——多种形态多态的分类&#xff1a;1.静态多态&#xff1a;函数重载和运算符重载&#xff08;复用函数名&#xff09;2.动态多态&#xff1a;派生类和虚函数实现运行时多态静态多态和动态多态的区别&#xff1a;静态多态的函数地址早绑定——编译阶段确定函数地址动态多态…

页面访问升级出错怎么解决

相信大家在访问网站的时候时常会遇到页面访问界面升级&#xff0c;暂时不可能进行访问操作&#xff0c;可能遇到这种情况很多小伙伴们都不知道怎么版&#xff0c;其实互联网网页在正常使用过程中是不会出现这种问题的。那么如果遇到页面访问界面升级怎么办?页面访问界面升级通…

TryHackMe-Binex

Binex 枚举计算机并获取交互式 shell。利用 SUID 位文件&#xff0c;使用 GNU 调试器利用缓冲区溢出并通过 PATH 操作获得根访问权限。 端口扫描 循例 nmap SMB枚举 题目给了提示&#xff1a;Hint 1: RID range 1000-1003 Hint 2: The longest username has the unsecure pa…

面试中问你查看日志的命令,可不能只说tail,cat,more

首选&#xff0c;如何查看日志&#xff1a; 很多初级测试人员&#xff0c;在进行执行测试用例这个步骤时&#xff0c;发现bug&#xff0c;不能更加的准确去定位bug&#xff0c;在这样的情况下就可以打开Linux服务器&#xff0c;敲命令查看操作进行中的实时日志&#xff0c;当系…

用arthas轻松排查线上问题

你是否在项目中会碰到以下一些问题&#xff1a; 在代码中打印各种日志来排查&#xff0c;比如方法的入参&#xff0c;出参&#xff0c;及在方法体中打印日志判断走哪行代码还有你觉得代码没问题&#xff0c;可是运行出现却是以前的bug&#xff0c;感觉代码没修改&#xff0c;或…

120.(leaflet篇)区域下钻,区域钻取

听老人家说:多看美女会长寿 地图之家总目录(订阅之前建议先查看该博客) 文章末尾处提供保证可运行完整代码包,运行如有问题,可“私信”博主。 效果如下所示: 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYPE html> <html>