鱼C论坛

 找回密码
 立即注册
楼主: zhangjinxuan

[已解决]程序制作时的一个问题,请大佬求助

[复制链接]
 楼主| 发表于 2022-10-15 09:32:56 | 显示全部楼层
人造人 发表于 2022-10-15 09:11
void dfs(int i, int s) { //深搜找答案
你这dfs和枚举有何区别?

dfs函数里面有递归啊,dfs函数里有回溯啊,怎么能说是枚举算法啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-15 09:47:41 | 显示全部楼层
本帖最后由 tommyyu 于 2022-10-15 09:49 编辑
zhangjinxuan 发表于 2022-10-15 09:28
请举例说明,我认为你说的那种必须是不按照顺序的算式调换一下数字位置就可以了


11 * 4 - 4 * 5
3 * 12 - 1 * 12
8 * 10 - 8 * 7
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-15 09:58:10 | 显示全部楼层
tommyyu 发表于 2022-10-15 09:47
11 * 4 - 4 * 5
3 * 12 - 1 * 12

不是你想的那样,我的程序计算出来的算式只有在忽略优先级从左往右算的时候才可得到24

比如:
5+4*3-4
这个算式从左向右算是等于24,对吧,我的意思是在这个算式中添加一些括号,使它不用忽略优先级,不用从左往右算就可以得到24,就拿5+4*3-4举例,他加上括号:(5+4)*3-4

你的两个反例从左向右算得不到24,还有,看代码,看代码,看看就明白我的意思了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-15 09:58:57 | 显示全部楼层
zhangjinxuan 发表于 2022-10-15 09:19
哎,都没有理解题面,语文表达才重要啊

比如5*8-6*7
5和8是二级算式,相乘也是二级算式,不需要加括号
5*8-6 是两个二级算式相减,变成一级算式,但是还不需要加括号
5*8-6*7是一级算式乘二级算式,所以一级算式需要加上括号,就是(5*8-6)*7
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-15 09:59:45 | 显示全部楼层
tommyyu 发表于 2022-10-15 09:47
11 * 4 - 4 * 5
3 * 12 - 1 * 12
8 * 10 - 8 * 7

我的程序算出来的算式只有从左向右算才等于24,看代码吧,看就能明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-15 10:01:47 | 显示全部楼层
tommyyu 发表于 2022-10-15 09:58
比如5*8-6*7
5和8是二级算式,相乘也是二级算式,不需要加括号
5*8-6 是两个二级算式相减,变成一级算 ...

我再思考一会儿...让我想想...
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-15 10:20:02 | 显示全部楼层

回帖奖励 +2 鱼币

        走弯路了不是?
       1 × 2 × 3 × 4 = 24
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-15 16:06:41 | 显示全部楼层    本楼为最佳答案   
本帖最后由 dolly_yos2 于 2022-10-15 16:10 编辑

可以测试一下看看是不是这个意思(总觉得写复杂了)(假设操作数总在 int 范围内、输入总是以操作数开始、除最后一个操作数外每个操作数后总是紧接着一个四则运算符、每个四则运算符后总是紧接着一个操作数、输入中没有任何其他符号)
  1. #include <iostream>
  2. #include <vector>
  3. void parse_helper(
  4.         const std::vector<int>& operands,
  5.         const std::vector<char>& operators,
  6.         const size_t level,
  7.         std::ostream& output
  8. ){
  9.         bool issue_parentheses = false;
  10.         if(level > 0){
  11.                 if(!(operators.at(level) & 4u) && (operators.at(level - 1) & 4u)){
  12.                         issue_parentheses = true;
  13.                         output.put('(');
  14.                 }
  15.                 parse_helper(operands, operators, level - 1, output);
  16.         }else{
  17.                 output << operands.at(0);
  18.         }
  19.         if(issue_parentheses) output.put(')');
  20.         output.put(operators.at(level) - 1);
  21.         output << operands.at(level + 1);
  22. }
  23. void parse(std::istream& input, std::ostream& output){
  24.         std::vector<int> operands;
  25.         std::vector<char> operators;
  26.         int value;
  27.         char op;
  28.         input >> value;
  29.         operands.emplace_back(value);
  30.         while(true){
  31.                 input >> op >> value;
  32.                 if(input.eof()) break;
  33.                 operands.emplace_back(value);
  34.                 operators.emplace_back(op + 1);        // 一个小小的 trick 来简化算符优先级判断
  35.                                                 // 考虑到 ASCII 下四则运算符的码值分别为
  36.                                                 //  * -- 0x2A (00101010)
  37.                                                 //  + -- 0x2B (00101011)
  38.                                                 //  - -- 0x2D (00101101)
  39.                                                 //  / -- 0x2F (00101111)
  40.                                                 // 给码值加一后可见高优先级运算符的第三低有效位(从一开始)
  41.                                                 //  均为 0 而低优先级的均为 1
  42.         }
  43.         parse_helper(operands, operators, operators.size() - 1, output);
  44. }
  45. int main(){
  46.         parse(std::cin, std::cout);
  47.         return 0;
  48. }
复制代码

评分

参与人数 1荣誉 +2 收起 理由
zhangjinxuan + 2 感谢大佬,问题解决了^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-15 16:08:07 | 显示全部楼层
dolly_yos2 发表于 2022-10-15 16:06
可以测试一下看看是不是这个意思(总觉得写复杂了)

稍等,现在听课,待会看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-10-15 16:56:47 From FishC Mobile | 显示全部楼层
zhangjinxuan 发表于 2022-10-15 09:32
dfs函数里面有递归啊,dfs函数里有回溯啊,怎么能说是枚举算法啊

枚举不就是一个一个的试么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-10-15 20:27:05 | 显示全部楼层
dolly_yos2 发表于 2022-10-15 16:06
可以测试一下看看是不是这个意思(总觉得写复杂了)(假设操作数总在 int 范围内、输入总是以操作数开始、 ...

所以代码精简后就是这样,对吗:
  1. #include <bits/stdc++.h>
  2. using namespace std;

  3. char opts[11];
  4. int nums[11], n;
  5. void parse_helper(int l) {
  6.     bool flag = false;
  7.     if(l > 1) {
  8.         if((opts[l] == '*' || opts[l] == '/') && (opts[l - 1] == '+' || opts[l - 1] == '-')){
  9.                 flag = true;
  10.             printf("(");
  11.         }
  12.         parse_helper(l - 1);
  13.     } else printf("%d", nums[1]);
  14.     if (flag) printf(")");
  15.     printf("%c", opts[l]);
  16.     if (l != n) printf("%d", nums[l + 1]);
  17. }
  18. int main() {
  19.         scanf("%d%d", &n, &nums[1]);
  20.         getchar();
  21.         for (int i = 2; i <= n; ++i) {
  22.                 scanf("%c%d", &opts[i - 1], &nums[i]);
  23.                 getchar();
  24.         }
  25.         parse_helper(n);
  26.     return 0;
  27. }
复制代码

如果是,那么我就测试一下,测试成功就设置你为最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-27 11:57:17 | 显示全部楼层
哪里有tommyyu的题解?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-27 13:54:09 | 显示全部楼层
高山 发表于 2022-11-27 11:57
哪里有tommyyu的题解?

题解是dolly_yos2提供的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-28 10:54:42 | 显示全部楼层
dolly_yos2 发表于 2022-10-15 16:06
可以测试一下看看是不是这个意思(总觉得写复杂了)(假设操作数总在 int 范围内、输入总是以操作数开始、 ...

对了,我看大佬已经中级鱼油了,现在可以批准加好友了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-28 10:55:09 | 显示全部楼层
人造人 发表于 2022-10-15 16:56
枚举不就是一个一个的试么?

我蒙了,我算法都白学了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-28 10:56:39 | 显示全部楼层
tommyyu 发表于 2022-10-15 08:59
我的意思是这种方法可能不一定能够求出答案,因为会有那种必须是不按照顺序的算式

https://fishc.com.cn/thread-221351-1-1.html 第二弹
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-28 10:57:23 | 显示全部楼层
dolly_yos2 发表于 2022-10-15 16:06
可以测试一下看看是不是这个意思(总觉得写复杂了)(假设操作数总在 int 范围内、输入总是以操作数开始、 ...

https://fishc.com.cn/thread-221351-1-1.html 第二弹
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-28 10:58:17 | 显示全部楼层
zhangjinxuan 发表于 2022-11-28 10:56
https://fishc.com.cn/thread-221351-1-1.html 第二弹

可不可以打表
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-28 10:59:47 | 显示全部楼层
zhangjinxuan 发表于 2022-11-28 10:55
我蒙了,我算法都白学了吗

我感觉dfs、bfs、dp都是高级枚举
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-28 10:59:48 | 显示全部楼层

你说呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-14 01:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表