Найти - Пользователи
Полная версия: Обход в глубину
Начало » Центр помощи » Обход в глубину
1 2 3 4
izekia
valoroso
да я знаю, сразу бы сказал … я в свое время и так потратил много на сферу, кстати, лучше там тренируйся, там хотя бы причину ошибки можно увидеть
izekia
в общем если на скорость, то по-другому надо делать, а на втором сайте места под стек не хватает
FishHook
проверяйте

 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)
valoroso
FishHook
проверяйте
data = """5 10
##..#####.
.#.#.#....
###..##.#.
..##.....#
.###.#####"""

уже ошибка, 8 вместо 5.
а так алгоритм шустрый.


valoroso
izekia
valorosoда я знаю, сразу бы сказал … я в свое время и так потратил много на сферу, кстати, лучше там тренируйся, там хотя бы причину ошибки можно увидеть

я обычно на codewars и то C#. А тут кровь из носа надо эту задачу именно на Питоне решить. Хотя разнообразие всегда хорошо)
izekia

valoroso
я обычно на codewars и то C#. А тут кровь из носа надо эту задачу именно на Питоне решить. Хотя разнообразие всегда хорошо)
ну если до завтра ждет то я сделаю
valoroso
izekia
янтарь или виски?)
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)
FishHook
Ага! А вот такой вариант попробуйте

 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)
valoroso
izekia
все еще неоптимально, но быстрее

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB