围棋棋盘上有一片连续的白子,没有黑子。请写一个函数,计算返回该片白子的气数。函数输入参数为任一个白子的位置。
注:围棋规则:格子棋盘,棋子下在十字交叉点上,纵横线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; }