上周五,在会议室吃午餐时,同事 (其实是前辈,临时待在上海) 说他小女儿有个课余作业,需要他帮助,就是上面的拼图游戏,
他就用程序员最拿手的方式把这个问题给解决,不过他是使用 c 语言解决出来的,使用 1 分钟多点。
我感觉很好玩,就使用 ruby 试写一下,使用 3x5,3x10 做测试,分别使用 1s,46s 左右跑出结果来,但计算 3x20 时跑不出结果来 (1 小时以上).
我认为是代码(没有使用 ruby 最合适的用法)或算法(多使用递归,可能使用不得当)写的不好,所以才有此救助贴。
下面我会把代码的解法思路,认为的瓶颈简单描述一下。
递归尝试每一个 [积木条] 形状
1 [积木条] 形状深度大于 3,直接跳过 2 使用一个 [积木条] 形状后,把该 [积木条] 类型的所有形状都标记一下,下次遇到直接跳过 3 递归遍历 [拼盘] 中所有连续的空白块 (感觉此处代码有很大优化空间),数量都应该除 5 余 0,否则跳过 4 [积木条] 形状在 [拼盘] 上找不到放置,跳过 5 把 [积木条] 形状放置到 [拼盘] 上 6 是否拼满了
1 yes 打印 2 no,继续尝试下一个 [积木条] 形状
其中为了便于区分 [积木条] 形状,有对每种 [积木条] 类型对应一个符号,要不然,打印出来,全是 1,同时也为了 uniq 一下。
上周五晚上就把 3x5 的测试跑出来了,但需要 28s,这几天一直在优化代码 (现在需要 1s),但还是跑不出 3x20 的结果。
其中尝试对 3x5 的结果再操作,最终实现 3x20,这条路不行的,3x5 的结果集包含的 [积木条] 类型是互斥的,经计算只能两两组合,实现 3x10.
对于写出的代码跳不出结果来,感觉很无奈...压箱底不管,还不如发个贴,救助学习一下。
https://github.com/jay16/phantom/tree/master/bricks
util.rb - 通用代码(复制对象,打印等) shapes.rb - 处理 [积木条] 形状 adapter.rb - 处理 [积木条] 形状与 [拼盘] 位置 bricks.rb - 调用上面三个文件 _test.rb - 测试代码
可以针对解法逻辑、代码风格、命令规范、测试规范进行批评。 (当前状态感觉自己的代码很丑陋)
贴一下电脑配置,