吴昊品游戏核心算法 Round 10 —— 关于先前发布的围棋算法(模拟)中目数统计函数的全解析(感谢林安泽)
经过与华科ACM林安泽交流后得知,作者没有考虑到如下两种情况:(1)在收官阶段,实地如何计算在内(2)在终盘结束的时候,是不可能有没有归属的空格的,所有的空位置是都有归属的,这也是围棋的常识,看来作者貌似不会下围棋哦!^_^
首先,源码中有一个问题,就是c=qipan[j][i].color应该改为c=qipan[i][j].color,在此基础上,这段代码主要是统计 白子的数目,因为围棋中黑子让白子3又3/4个子,具体为什么这样将在之后的吴昊系列中讲解。那么,我们可以看到,只需要单方面地统计白子的总数目就可以 了。首先将三个数组都置为0,从第一行开始扫描。如果一开始是空白的话,就直接算作空白的了。当遇到黑子或者白子的时候,我们开始统计区域,这里将k设为 区域标识。不过,这里有一个问题,作者还是缺乏围棋的基本常识,围棋是用了围地的,而不是用来吃子的,该统计确实是可以统计中盘的一些势力范围,但是不可 能统计最终收官之后的情况,因为整个流程的“思维”就不是围地的“思维”。基于以上一点,我们再来看标程,其实,作者本人也只是实现了一种情况。首先,忽 略黑棋的区域中有白棋的可能,这是基于前面的代码所实现的。因为,每次吃子的时候,就将里面的白子都清除了。这样,我们考虑每一行的“一段黑子”,可以发 现,只要收尾都为黑,那么中间的空格都是黑子的了。这也就是为什么每次都要将空位置都置0,这也是为了防止黑所拥有的空格被白计算了。
附上这段源代码:
1 int summ(void)
2 {
3 int i=0,j=0,c=2,k=2;
4 //计数白子,黑子,空白的数目
5 sum[0]=0;
6 sum[1]=0;
7 sum[2]=0;
8 for (i=1;i<=19;i++)
9 { //从最外层开始搜索
10 k=qipan[i][1].color;
11 for (j=1;j<=19;j++)
12 {
13 c=qipan[j][i].color;
14 switch (c)
15 {
16 case 2:
17 if (k==2) sum[2]++;
18 else sum[k]++;
19 break;
20 case 0:
21 if (k==0)
22 {
23 sum[c]++;
24 }
25 else if(k==2)
26 {
27 sum[c]=sum[c]+sum[2]+1;
28 k=c;
29 sum[2]=0;
30 }
31 else if(k==1)
32 {
33 sum[c]++;
34 k=c;
35 sum[2]=0;
36 }
37 break;
38 case 1:
39 if (k==1)
40 {
41 sum[c]++;
42 }
43 else if(k==2)
44 {
45 sum[c]=sum[c]+sum[2]+1;
46 k=c;
47 sum[2]=0;
48 }
49 else if(k==0)
50 {
51 sum[c]++;
52 k=c;
53 sum[2]=0;
54 }
55 break;
56 }
57 }
58 }
59 return sum[0];
60 }
2 {
3 int i=0,j=0,c=2,k=2;
4 //计数白子,黑子,空白的数目
5 sum[0]=0;
6 sum[1]=0;
7 sum[2]=0;
8 for (i=1;i<=19;i++)
9 { //从最外层开始搜索
10 k=qipan[i][1].color;
11 for (j=1;j<=19;j++)
12 {
13 c=qipan[j][i].color;
14 switch (c)
15 {
16 case 2:
17 if (k==2) sum[2]++;
18 else sum[k]++;
19 break;
20 case 0:
21 if (k==0)
22 {
23 sum[c]++;
24 }
25 else if(k==2)
26 {
27 sum[c]=sum[c]+sum[2]+1;
28 k=c;
29 sum[2]=0;
30 }
31 else if(k==1)
32 {
33 sum[c]++;
34 k=c;
35 sum[2]=0;
36 }
37 break;
38 case 1:
39 if (k==1)
40 {
41 sum[c]++;
42 }
43 else if(k==2)
44 {
45 sum[c]=sum[c]+sum[2]+1;
46 k=c;
47 sum[2]=0;
48 }
49 else if(k==0)
50 {
51 sum[c]++;
52 k=c;
53 sum[2]=0;
54 }
55 break;
56 }
57 }
58 }
59 return sum[0];
60 }
浙公网安备 33010602011771号