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