成语有向图局部示例
为了节省留白没有画出箭头,指向关系应该不言自明。节点条目来自一个13011词的成语词典数据库。网上还可以找到别的版本,但我选了一万三千词这个。既可以照顾到一些同义词变化,比如「茶余饭后/茶余酒后」,或者顺序倒换像「地坼天崩/天崩地坼」;同时也去掉了长尾上词频较低的用法,不考虑那些让人感觉不那么像成语的成语。
当然也节省很多CPU时间。当图建好了之后。接下来要做的
1. 从图中随机选择一个节点,也即一个成语,作为当前节点。例如,「按部就班」 2. 在屏幕上打印当前节点 3. 读取本节点指向的所有能接的成语选项。例如「按部就班」有三个可以接的选项
按部就班: 班荆道故 班门弄斧 班师回朝
但要排除当前节点本身以外,比如「为所欲为」指向了自己
为所欲为: 为所欲为 为丛驱雀 为德不卒 为富不仁 为非作歹 ....
选项表中应该划去
4. 当前节点已经用掉了。从图中摘掉当前节点,以及所有相邻边。就像你搭格子的时候,拆掉一个小球,把插在小球上的小棍也都拆掉。
此时我们的图会变得稀疏一点点
5. 从刚才得到的选项列表中随机选择一个接上,作为新的当前节点
重复上述步骤2-5,直到当前成语没有任何可接的选项了,此时你得到了图中一片孤独的树叶,没有任何树枝相连。这个时候就算接龙玩死了。屏幕上打印出来的,就是本次接龙的序列。
我们要做的,就是把游戏重复多次,就能找到最容易玩死的地方。
从直觉你可能会说,直接找没有下家的成语不就成了吗。嗯,那是一种考虑这个问题的方式,换一个角度思考,除非你脱口而出第一个词就把游戏终结,其他时候,总得是有一个什么别的词,把你引到现在的词。比如已知「似懂非懂」是一个死亡节点。你需要一个别人说「xxx似」才能到这儿,对吧。
所以最容易死的应该是进口大、出口窄的词。它的首字经常出现在别的成语的末尾,但它指向的下家却山穷水尽。要看它,得看它的上家,上家出现的概率又取决于它上家的上家。每一个词都不是孤立的。要决定最后那个节点,除非把游戏玩上一遍不可。
书读百遍,其义自见。玩游戏也不例外,玩的遍数多了,就能进行统计了。那么老老实实地玩呗,写个程序开始跑,屏幕上滚动出现下列字样:
学而优则仕五方杂处 → 处心积虑十万八千里 → 里丑捧心 → 心如死灰 →