Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Uncategorized category for Safe Coasts by Moff
class Field(object):
def __init__(self, m):
self.m = list(map(list, m))
self.delta4 = [(0, 1), (0, -1), (1, 0), (-1, 0)]
self.delta8 = [(0, 1), (0, -1), (1, 0), (-1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)]
def finish_map(self):
start = []
for r, row in enumerate(self.m):
for c, v in enumerate(row):
if v == 'D':
start.append((r, c))
elif v == '.':
self.m[r][c] = 'S'
for x in start:
self.bfs(x)
def neighbours(self, i, j, delta):
return [(ci, cj) for ci, cj in ((i + di, j + dj) for di, dj in delta)
if 0 <= ci < len(self.m) and 0 <= cj < len(self.m[0])]
def neighbours4(self, i, j):
return self.neighbours(i, j, self.delta4)
def neighbours8(self, i, j):
return self.neighbours(i, j, self.delta8)
def bfs(self, x):
queue = [x]
while queue:
x = queue.pop()
for v in self.neighbours4(*x):
i, j = v
if self.m[i][j] == 'S' and \
all(self.m[zi][zj] != 'X'
for zi, zj in self.neighbours8(*v)):
self.m[i][j] = 'D'
queue.insert(0, v)
def finish_map(m):
f = Field(m)
f.finish_map()
return [''.join(row) for row in f.m]
Aug. 25, 2015