Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 15, 2016 10:36:40

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Обход в глубину

В общем вот решение быстрее моего предыдущего на 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)



Офлайн

#2 Ноя. 15, 2016 11:53:57

valoroso
Зарегистрирован: 2016-11-14
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Обход в глубину

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))
вот логин/ пароль с сайта куда скидываю vobr/pythonpython

https://www.e-olymp.com/ru/problems/1065

И большое спасибо за участие)

Отредактировано valoroso (Ноя. 15, 2016 11:58:02)

Офлайн

#3 Ноя. 15, 2016 16:25:39

izekia
От:
Зарегистрирован: 2008-07-19
Сообщения: 317
Репутация: +  12  -
Профиль   Отправить e-mail  

Обход в глубину

нене все я в хс



Офлайн

#4 Ноя. 15, 2016 16:26:11

izekia
От:
Зарегистрирован: 2008-07-19
Сообщения: 317
Репутация: +  12  -
Профиль   Отправить e-mail  

Обход в глубину

может завтра … хотя завтра проект



Офлайн

#5 Ноя. 16, 2016 18:31:40

valoroso
Зарегистрирован: 2016-11-14
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Обход в глубину

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)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version