本文共 3308 字,大约阅读时间需要 11 分钟。
这道题是很有意思的快算24的题目。样例本身是有问题的,首先,由于括号的存在,解是不唯一的,其次,样例中给除法左右也加了括号:(1/5),这导致加括号的规则比较模糊。
尽管从disucss知道测试例子只有一个,但还是当做不知道地做了。题目其实不是很好写。一开始用的是string, 用dfs构建expression str,然后再evaluate(str) 看是不是24,找到就退出。但是由于左括号的存在,构建过程本身就很复杂,需要考虑多个左括号的情况,更难的地方在于evaluate一个string。
最终的解法是用树:首先构建所有可能的expression tree,然后一一evaluate,找到就退出。表达树是递归地构建的,左右节点既可以是一个operand,比如5,也可以是一个子树。实现中使用了c++ inheritance. Tree和Operand class都继承了Node class。 Node是一个interface (c++ 中的纯虚class),有两个接口: double evaluate() 和 string expr()。
这样做的好处是逻辑很清晰,扩展性也很好:可以轻松地改成5个数或更多。
由于测试样例,这里的括号规则是能加就加,除了最外层。
/* ID: thestor1 LANG: C++ TASK: poj3983 */#include #include #include #include #include #include #include #include #include #include #include #include
转载地址:http://gvxli.baihongyu.com/