算法过程如下,输入计算棋气的起始子,检查我方棋子其周边的空白,并查看此空白是否已经计算过气了,如果没有计算过气加一,如果已经计算则略过,进而递归调用计算我方棋子上下左右子的气,最后算法会返回棋串的子数和气数。算法注释十分详尽。
这个计算棋子气的算法,参考http://www.cnblogs.com/tuanzang/archive/2013/02/27/2935861.html,结合我们自身的应用需要优化和修改。这篇博文介绍了更多关于围棋的算法,有兴趣的朋友可以进一步阅读。
原文suanqi函数会重复计算已经计算过的棋串效率不高,应该对已经算过气的函数不在重复算气,并且我们需要知道棋串的长度。
#include <iostream>
#include <utility>
#define EDGE 19
int go[EDGE][EDGE];//棋盘数据,0为黑棋,1为白棋,2为空白
int gokong[EDGE][EDGE]; //0=该空点未曾计算过气,1=已计算,避免重复计算公气
int gozi[EDGE][EDGE]; //0=该子未计算串气,1=已计算,避免重复计算同一个子的气
int goqi; //此棋串气数
int goziLength;//此棋串子数
int g_gozi[EDGE][EDGE];
void str_qi(int x,int y,int hb)
{
//本函数计算 x,y 处的hb颜色棋子的气
gozi[x][y]&