【原题链接】
题面概述:
给你
4
4
4 个自然数作为操作数,你可以使用四个运算
+
,
−
,
×
,
÷
,
+,-,\times,\div,
+,−,×,÷,,和
(
)
()
()。
要求:
- 四个数都是整数,中间结果也必须是整数
- 不能 ÷ 0 \div \ 0 ÷ 0 (这个还用说吗?)
- 运算后等于 24 24 24
如果有解的话,只要输出一个解,输出的是三行数据,分别表示运算的步骤。其中第一行是输入的两个数和一个运算符和运算后的结果,第二行是第一行的结果和一个输入的数据、运算符、运算后的结果,或者是另外两个数的输出结果;第三行是前面的结果第二行的结果或者剩下的一个数字、运算符和“=24”。如果两个操作数有大小的话则先输出大的。
如果没有解则输出No answer!
如果有多重合法解,输出任意一种即可。
注:所有运算结果均为正整数
题意分析:
我们就样例来分析题意:
1 2 3 7
2+1=3 7*3=21 21+3=24
- 先对于方案种数来看:
允许改变运算顺序,于是就可以枚举其全排列,(确保每个元素都有 4 4 4 种位置的可能) - 然后对于运算顺序来看:
一般地,每一种排列,每相邻 2 2 2 个数之间都至少有 + , − , × +,-,\times +,−,× 三种运算(除法另行考虑),我们可以将这三个运算先行枚举。
特殊地,对于除法,我们需要判定一下几个条件:- 除数 ≠ 0 \ \neq \ 0 = 0 (这还用说吗?)
- 能够整除
- 再对于中间结果来看:
我们使用一个数组存下全排列,再使用一个数组存下中间的符号,再开一个数组存下中间结果,然后使用dfs
的方式遍历求解,利用dfs(int dep, int num)
其中,dep
表示搜索的深度(中间结果步数),num
表示目前在遍历第几种排列方案。
一旦dep == 5
也即所有 4 4 4种方案遍历完毕的时候,累加ans
,最后判定ans == 24 {putans()}
最后只要输出答案即可。