Форум сайта python.su
valoroso
да я знаю, сразу бы сказал … я в свое время и так потратил много на сферу, кстати, лучше там тренируйся, там хотя бы причину ошибки можно увидеть
Офлайн
в общем если на скорость, то по-другому надо делать, а на втором сайте места под стек не хватает
Офлайн
проверяйте
def fn(data): #Prepare data n = m = None 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 = {} 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 - 1, col_num)) 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 continue for neighbor in neighbors: if neighbor in mapping: bed_num = mapping[neighbor] mapping[(row_num, col_num)] = bed_num break else: beds += 1 mapping[(row_num, col_num)] = beds return beds data = """5 10 ##......#. .#..#...#. .###....#. ..##....#. ........#.""" print fn(data)
Отредактировано FishHook (Ноя. 14, 2016 17:46:48)
Офлайн
FishHook
проверяйте
data = """5 10
##..#####.
.#.#.#....
###..##.#.
..##.....#
.###.#####"""
Отредактировано valoroso (Ноя. 14, 2016 22:58:06)
Офлайн
izekia
valorosoда я знаю, сразу бы сказал … я в свое время и так потратил много на сферу, кстати, лучше там тренируйся, там хотя бы причину ошибки можно увидеть
Офлайн
valorosoну если до завтра ждет то я сделаю
я обычно на codewars и то C#. А тут кровь из носа надо эту задачу именно на Питоне решить. Хотя разнообразие всегда хорошо)
Офлайн
izekiaянтарь или виски?)
Офлайн
все еще неоптимально, но быстрее
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)
Отредактировано izekia (Ноя. 15, 2016 00:18:51)
Офлайн
Ага! А вот такой вариант попробуйте
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 = {} 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 mapping[(row_num, col_num)] = beds 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 redraw = None for neighbor in neighbors: if neighbor in mapping and mapping[neighbor] != bed_num: redraw = mapping[neighbor] mapping[neighbor] = bed_num if redraw: for el in mapping: if mapping[el] == bed_num: mapping[el] = redraw return len(set(mapping.values())) data = """5 10 ##..#####. .#.#.#.... ###..##.#. ..##.....# .###.#####""" print fn(data)
Офлайн
izekia
все еще неоптимально, но быстрее
Офлайн