from util import EMPTY ## Utility class for finding continuous regions on a Go.board. class HelperBoard: def __init__(self,board): self._refBoard=board # Go.board, readonly self._boardSize=len(board) self._board=[[EMPTY]*self._boardSize for i in range(self._boardSize)] self._visited=[0]*(self._boardSize**2)*2 self._visitedCount=0 self._libs=[0]*(self._boardSize**2)*2 self._libCount=0 ## Performs a recursive breadth first search of a continuous area filled with filling. # # @return {True,False}: True on encountering needle (usually free liberty), False otherwise. def floodFill(self,filling,r,c,needle=None): if c<0 or c>=self._boardSize or r<0 or r>=self._boardSize: return False # out of range if self._board[r][c]: return False # already visited if self._refBoard[r][c]==needle: return True # found something if self._refBoard[r][c]!=filling: if self._refBoard[r][c]==EMPTY: # remember group liberties self._board[r][c]=True self._libs[self._libCount*2]=r self._libs[self._libCount*2+1]=c self._libCount+=1 return False # out of area boundary self._board[r][c]=True # set visited self._visited[self._visitedCount*2]=r self._visited[self._visitedCount*2+1]=c self._visitedCount+=1 # check neighbors return self.floodFill(filling,r,c-1,needle) or \ self.floodFill(filling,r,c+1,needle) or \ self.floodFill(filling,r-1,c,needle) or \ self.floodFill(filling,r+1,c,needle) def getContinuousArea(self): for i in range(self._visitedCount): yield (self._visited[i*2],self._visited[i*2+1]) def getLiberties(self): for i in range(self._libCount): yield (self._libs[i*2],self._libs[i*2+1]) def clear(self): for i in range(self._visitedCount): (r,c)=(self._visited[i*2],self._visited[i*2+1]) self._board[r][c]=EMPTY self._visitedCount=0 for i in range(self._libCount): (r,c)=(self._libs[i*2],self._libs[i*2+1]) self._board[r][c]=EMPTY self._libCount=0