Форум сайта python.su
В общем вот решение быстрее моего предыдущего на 500х500 в 800 раз
def fn(data): matrix = [] metric, field = data.split("\n", 1) n, m = map(int, metric.split()) for row in field.split("\n"): matrix.append([x == "#" for x in row]) beds = 0 mapping = {} groups = {} for row_num, row in enumerate(matrix): for col_num, cell in enumerate(row): if not cell: continue neighbors = [] if row_num > 0: if matrix[row_num - 1][col_num]: neighbors.append((row_num - 1, col_num)) if col_num < m - 1: if matrix[row_num][col_num + 1]: neighbors.append((row_num, col_num + 1)) if row_num < n - 1: if matrix[row_num + 1][col_num]: neighbors.append((row_num + 1, col_num)) if col_num > 0: if matrix[row_num][col_num - 1]: neighbors.append((row_num, col_num - 1)) if not neighbors: beds += 1 groups[beds] = [(row_num, col_num)] continue for neighbor in neighbors: if neighbor in mapping: bed_num = mapping[neighbor] break else: beds += 1 bed_num = beds mapping[(row_num, col_num)] = bed_num groups.setdefault(bed_num, []).append((row_num, col_num)) redraw = None for neighbor in neighbors: if neighbor in mapping and mapping[neighbor] != bed_num: redraw = mapping[neighbor] mapping[neighbor] = bed_num if redraw: groups[redraw] = groups[bed_num] del groups[bed_num] for bed in groups[redraw]: mapping[bed] = redraw return len(groups)
Офлайн
FishHookможет во мне проблема..
В общем вот решение быстрее моего предыдущего на 500х500 в 800 раз
def fn(field, n, m):
matrix = []
for row in field:
matrix.append([x == "#" for x in row])
beds = 0
mapping = {}
groups = {}
for row_num, row in enumerate(matrix):
for col_num, cell in enumerate(row):
if not cell:
continue
neighbors = []
if row_num > 0:
if matrix[row_num - 1][col_num]:
neighbors.append((row_num - 1, col_num))
if col_num < m - 1:
if matrix[row_num][col_num + 1]:
neighbors.append((row_num, col_num + 1))
if row_num < n - 1:
if matrix[row_num + 1][col_num]:
neighbors.append((row_num + 1, col_num))
if col_num > 0:
if matrix[row_num][col_num - 1]:
neighbors.append((row_num, col_num - 1))
if not neighbors:
beds += 1
groups[beds] = [(row_num, col_num)]
continue
for neighbor in neighbors:
if neighbor in mapping:
bed_num = mapping[neighbor]
break
else:
beds += 1
bed_num = beds
mapping[(row_num, col_num)] = bed_num
groups.setdefault(bed_num, []).append((row_num, col_num))
redraw = None
for neighbor in neighbors:
if neighbor in mapping and mapping[neighbor] != bed_num:
redraw = mapping[neighbor]
mapping[neighbor] = bed_num
if redraw:
groups[redraw] = groups[bed_num]
del groups[bed_num]
for bed in groups[redraw]:
mapping[bed] = redraw
return len(groups)
n, m = input().split()
n = int(n)
m = int(m)
field = [ list(input()) for _ in range(n) ]
print(fn(field, n, m))
izekia
valorosoа покажи код с моей задачей, который ты отправляешь? может где-то там ошибка?
def solve1(N, M, case):
l = [[0] * M for i in range(N)]
n = 0
connected = set()
for i in range(N):
for j in range(M):
x = 0
if case[i][j] == '#':
if (i > 0 and l[i-1][j] != 0):
x = l[i-1][j]
left = l[i][j-1]
if (j > 0 and left != 0):
if x != left:
if x > 0:
connected.add(frozenset((x, left)))
else:
x = left
if x == 0:
n += 1
x = n
l[i][j] = x
#print('\n'.join(str(r) for r in case))
#print('\n'.join(str(r) for r in l))
#print(connected)
return n - len(connected)
N, M = map(int, input().split())
case = [ list(input()) for _ in range(N) ]
print(solve1(N, M, case))
Отредактировано valoroso (Ноя. 15, 2016 11:58:02)
Офлайн
нене все я в хс
Офлайн
может завтра … хотя завтра проект
Офлайн
izekiaМожет кому пригодится
может завтра … хотя завтра проект
n, m = map(range, map(int, input().split())) f = [list(input()) for _ in n] b =0 for i in n: for j in m: if f[i][j] == '#': b += 1 s = [ (i,j) ] while len(s) != 0: x, y = s.pop() if x in n and y in m and f[x][y] == '#': f[x][y] = '.' s += [(x + 1, y)] s += [(x - 1, y)] s += [(x, y - 1)] s += [(x, y + 1)]
Отредактировано valoroso (Ноя. 16, 2016 19:23:02)
Офлайн