围棋棋盘上有一片连续的白子,没有黑子。请写一个函数,计算返回该片白子的气数。函数输入参数为任一个白子的位置。
注:围棋规则:格子棋盘,棋子下在十字交叉点上,纵横线19*19。一片棋子,与其中任一子相邻的空交叉点称为这片子的1口气,所有这样的交叉点数量是这片子的气数。比如中央的单独一个棋子,上下左右4口气,气数为4;棋盘左上角的单独棋子,右边加下边两口气,气数是2;中央的两个相连的白子,气数为6。等等。
void change_axis(int &x,int & y,int i){
switch(i){
case 0:
if(x>0)
x-=1;
break;
case 1:
if(y<18)
y+=1;
break;
case 2:
if(x<18)
x+=1;
break;
case 3:
if(y>0)
y-=1;
break;
}
}
//DFS版本
void dfs(vector<vector<int>> & board,int x,int y,int & count){
board[x][y]=-1;
for(int i=0,tmp_x=x,tmp_y=y;i<4,++i){
change_axis(x,y,i);
if(board[x][y] == 1)
dfs(board,x,y,count);
else if(board[x][y] == 0){
board[x][y]=-1;
count++;
}
x=tmp_x,y=tmp_y;
}
}
//BFS版本
int bfs(vector<vector<int>> & board,queue<vector<int>>& que,int x,int y){
que.push({x,y});
for(;!que.empty();){
vector<int> tmp=que.pop(),save=tmp;
for(int i=0;i<4;++i){
change_axis(tmp[0],tmp[1],i);
if(tmp == save)
continue;
if(board[tmp[0]][tmp[1]]==1){
que.push(tmp);
board[tmp[0]][tmp[1]]=-1;
}
else if(board[tmp[0]][tmp[1]]==0){
board[tmp[0]][tmp[1]]=-1;
count++;
}
}
}
return count;
}