#python #массивы #алгоритм #python_3x
Прямоугольный садовый участок шириной N и длиной M метров разбит на квадраты со стороной 1 метр. На этом участке вскопаны грядки. Грядкой называется совокупность квадратов, удовлетворяющая таким условиям: -из любого квадрата этой грядки можно попасть в любой другой квадрат этой же грядки, -последовательно переходя по грядке из квадрата в квадрат через их общую сторону; -никакие две грядки не пересекаются и не касаются друг друга ни по вертикальной, ни по горизонтальной сторонам квадратов (касание грядок углами квадратов допускается). Подсчитайте количество грядок на садовом участке. Входные данные: 5 10 ##......#. .#..#...#. .###....#. ..##....#. ........#. Дополнительные модули не использовать. В первой строке находятся числа N и M через пробел, далее идут N строк по M символов. Символ # обозначает территорию грядки, точка соответствует незанятой территории. Других символов нет. (1 ≤ N, M ≤ 200) Основная проблема, в том, что код проверяется на сайте, где он проверяется по 12 тестам. Условия тестов не указаны, но одновременно их все пройти не получается... мой лучший вариант: 11 из 12: try: n, m = input().split() n = int(n) m = int(m) alll = [[] for i in range(n)] visited = [[False for j in range(m)] for i in range(n)] num = 0 for i in range(n): row = list(input()) for j in range(m): alll[i].append(row[j]) def dfs(x, y): visited [x][y]= True for dx, dy in [[-1, 0], [0, -1], [0, 1], [1, 0]]: if 0 <= x + dx <= n-1 and 0 <= y + dy <= m-1: if alll[x + dx][y + dy] == "#" and not visited[x + dx][y + dy]: dfs(x + dx, y + dy) for x in range(n): for y in range(m): if alll [x][y]== "#" and not visited[x][y]: dfs(x, y) num += 1 except Exception: num += 1 print(num) есть еще: 10 из 12: 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)) Был бы рад конструктивной критике. Спасибо за внимание)
Ответы
Ответ 1
Чтобы упростить условия в dfs(), можно окружить участок пустыми квадратами. Иначе алгоритм такой же как в первом примере в вопросе: Проверяем принадлежит ли квадрат ещё непосещённой грядке Посещаем все квадраты, принадлежащие этой грядке Повторяем пока все квадраты в огороде не проверим. Решение в лоб (числа входные маленькие). Не проверял на сайте, можете со своим кодом для разных вводов сравнить: #!/usr/bin/env python3 BED = '#' # mark garden bed WEST, NORTH, EAST, SOUTH = (-1, 0), (0, -1), (1, 0), (0, 1) # directions # read input N, M = map(int, input().split()) garden = [input().strip() for _ in range(N)] # surround the garden with empty squares garden[:] = [' '*(M+2)] + [' ' + row + ' ' for row in garden] + [' '*(M+2)] def visit_garden_bed(i, j, seen): """Enumerate all garden bed's squares""" q = [(i, j)] while q: i, j = vertex = q.pop() seen.add(vertex) for dx, dy in [WEST, NORTH, EAST, SOUTH]: # all possible directions y, x = vertex = (i+dy, j+dx) if garden[y][x] == BED and vertex not in seen: q.append(vertex) return 1 # the number of garden beds visited # visit all garden beds seen = set() # (i, j) print(sum(visit_garden_bed(i, j, seen) for i, row in enumerate(garden) for j, square in enumerate(row) if square == BED and (i, j) not in seen))
Комментариев нет:
Отправить комментарий