經過與華科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 }