Files
@ a98de30efa51
Branch filter:
Location: OneEye/src/go/helperboard.py - annotation
a98de30efa51
1.6 KiB
text/x-python
HelperBoard remembers group liberties
07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 07f3fda1cbd7 a98de30efa51 a98de30efa51 a98de30efa51 07f3fda1cbd7 07f3fda1cbd7 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 07f3fda1cbd7 a98de30efa51 a98de30efa51 a98de30efa51 07f3fda1cbd7 07f3fda1cbd7 a98de30efa51 a98de30efa51 07f3fda1cbd7 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 | 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
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 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._visited[i*2+1])
self._board[r][c]=EMPTY
self._libCount=0
|