Files
@ f1f8a2421f92
Branch filter:
Location: OneEye/src/go/helperboard.py - annotation
f1f8a2421f92
1.9 KiB
text/x-python
updated readme
07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 07f3fda1cbd7 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 a98de30efa51 07f3fda1cbd7 7ef3360afbe5 7ef3360afbe5 7ef3360afbe5 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 7f1984280936 7f1984280936 7f1984280936 7f1984280936 07f3fda1cbd7 a98de30efa51 a98de30efa51 07f3fda1cbd7 a98de30efa51 a98de30efa51 0cb3fbe06b5d 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
## 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
|