主题:【原创】将24进行到底 -- 泰让
有了思路后编程就不是很难的事情,下面对代码本身解释一下:
comp数组是存放组合的,op数组存放输入的四张牌点。validate函数计算已经生成的7位排列是否算出目标值,output把comp的逆波兰转化成熟悉的中缀表示法。注意这两个函数很象,只不过一个算浮点,另一个算字符串而已。
expand和expandable是生成排列的主体,其中expand用递归的办法从左向右试探comp的每一位,如果7位全部填完则调用validate和output输出结果。而expandable函数则试探在特定的位置上是否可以放置特定的数。其中第一个循环判断条件1(运算数出现最多1次),第二个循环测试条件3(从左往右扫描的时候运算数总比运算符多)。当试探成功后则在comp数组相应位置放上这个数,由于是递归,回溯可以自动进行。
程序应该可以在大多数c编译器上通过。我用的是windows 下的LCC和linux下的gcc。由于目标和牌数都定义成常量,所以容易改动,以解决更多张牌或者不同目标数的情况,也可以把它们定义成用户输入的变量。
虽然我知道比较不同语言的程序运行速度意义不大,可还是忍不住大致做了下测试。对于跑完全部4张牌的情况,在赛扬2.4G Windows XP SP2.0下大概需要9秒钟左右。同样的Binary在另一台双核1.8G笔记本上速度约7秒。当然,程序没有用到任何多线程的东西,所以在双核下没有太多的优势。
- 相关回复 上下关系8
🙂哈,你们论剑的时候别忘了俺! 面壁 字91 2007-03-10 11:38:58
😄那就贻笑大方了。 Highway 字4074 2007-03-09 22:04:41
🙂【注释之1】总体原理 3 泰让 字1624 2007-03-06 17:38:21
🙂【注释之2】程序实现
🙂还是烦请老兄再添点儿注解。。。 面壁 字151 2007-03-06 16:27:36
😄谢谢老弟的捧场。 1 Highway 字281 2007-03-06 08:42:13
🙂交换律和结合律 东方射日 字148 2007-03-06 09:37:26
🙂另外71行处理输出的时候漏了一对括号 泰让 字144 2007-03-06 09:18:15