西西河

主题:【原创】将24进行到底 -- 泰让

共:💬28 🌺15
全看分页树展 · 主题 跟帖
家园 【注释之2】程序实现

有了思路后编程就不是很难的事情,下面对代码本身解释一下:

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秒。当然,程序没有用到任何多线程的东西,所以在双核下没有太多的优势。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河