非常开心,这次的结队编程我和关腾组在了一起。
我们算法的主要思想是:
程序采用倒排的思想,在第一次搜索棋谱的时候建立一个索引(
l
ocatio_index
, 哈希表),表示每个棋子位置出现的棋谱文件,及出现在此棋谱文件的第几步(每个索引项的类型都是一个自定义的结构体:chess_loction)。(例如,哈希表中有一项的值是:<B[eg],(”001.sgf;005.sgf”,”56,9”)> ,这表示:在第e行,第g列有个黑子(Black),它出现在001.sgf文件的第56步和005.sgf文件的第9步)
定义一个棋子的struct(chess),记录这个棋子的行值和列值以及颜色,用一个chess[] 数组来代表一个棋谱,数组的索引值就是下棋的步数,根据实际情况,均从1开始计数,即chess[i]表示第i步所下棋子的位置信息。在第一次搜索的时候,遍历500个棋谱文件建立locatio_index的同时也维护一个所有棋谱文件的哈希表(allManual),allManual每个键值都是一个chess[](即一个棋谱)。
在第一次建立好locatio_index和allManual之后,我们搜索棋谱时,均先分别从locatio_index中找出所输入棋谱每一步的匹配文件,再找这些文件的交集,本着优先考虑位置,其次考虑步数的思想进行查找(位置是步数的2倍权重),选出匹配度最高的前30个棋谱。
实现程序:
下面是程序运行的一些截图。
;B[qd];W[dc];B[oc];W[qo];B[op];W[pq]
如下图所示,搜索的第一个棋谱结果即是007.sgf
现在要贴工作照了!
哈哈看看我们的手势(“首饰”)是不是很有默契呢~
原贴地址:
http://iteamwork.spaces.live.com/blog/cns!C59777B5C6A2F0F!183.entry?wa=wsignin1.0&sa=447664218
1154

被折叠的 条评论
为什么被折叠?



