2016年清华软院保研机试第3题(dfs回溯)

该博客介绍了如何使用深度优先搜索(DFS)解决一个保研机试题目,即根据给定的操作数和目标数字,判断通过四则运算能否得到目标值。博主详细阐述了思路,包括利用全局双端队列存储操作数,根据运算符的不同对操作数进行不同的处理,并在每次DFS后进行回溯。示例展示了如何应用这种方法解决一个具体的例子。
摘要由CSDN通过智能技术生成

问题描述

40 分, LeetCode hard 档次
• 从控制台输入一行,形如“n A1 A2 A3 … An B”。其中n代表操作数总数,A1~An 表示n 个操作数。B 代表目标数字。在此n 个操作数中以任意顺序插入n-1 个四则运算操作符,不能插入括号,形成的表达式能否得到B?能——输出1,不能——输出0。操作数和目标数字是整数,整数大小限制在32 位有符号整数范围内。
• 例如:
4 75 4 18 8 21
输出1 (75 / 4 + 18 / 8 = 21)
• 表达式求值、DFS(回溯)、栈、树

--------------------------------------------------------------------------------

思路

DFS深搜填入符号,DFS的参数是当前目标值b,返回值是“是否可以得到B”的布尔量。

用全局双端队列存储n个操作数。

由于优先级,对加/减法和乘/除法的处理略有差异。

如果是加法,则将第一个操作数a1出队,深搜求队列中剩下的数是否能拼成b-a1,记录布尔量b1 = dfs(b-a1)的结果;

如果是减法,则将第一个操作数a1出队,深搜求队列中剩下的数是否能拼成a1-b,记录布尔量b2 = dfs(a1-b)的结果;

如果是乘法,则将前两个操作数a1,a2出队,再将a1*a2插入队首,深搜求此时队列中的数是否能拼成b,记录布尔量b3 = dfs(b)的结果;

如果是除法,则将前两个操作数a1,a2出队࿰

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值