Прямоугольный садовый участок шириной N и длиной M метров разбит на квадраты со стороной 1 метр. На этом участке вскопаны грядки. Грядкой называется совокупность квадратов, удовлетворяющая таким условиям: -Python(Питон)

* из любого квадрата этой грядки можно попасть в любой другой квадрат этой же грядки, последовательно переходя по грядке из квадрата в квадрат через их общую сторону;
* никакие две грядки не пересекаются и не касаются друг друга ни по вертикальной, ни по горизонтальной сторонам квадратов (касание грядок углами квадратов допускается).
Подсчитайте количество грядок на садовом участке.

Входные данные
В первой строке находятся числа N и M через пробел, далее идут N строк по M символов. Символ # обозначает территорию грядки, точка соответствует незанятой территории. Других символов в исходном файле нет. 1 ≤ N, M ≤ 200.

Выходные данные
Вывести одно число — количество грядок на садовом участке.

Пример
Входные данные:

##..#####.
.#.#.#....
###..##.#.
..##.....#
.###.#####

Выходные данные:
5

import numpy as np
data0="""
##..#####.
.#.#.#....
###..##.#.
..##.....#
.###.#####
"""
 
arr = np.frombuffer(data0, dtype=np.int8)
arr = arr[arr>20].reshape((5, 10))
arr[arr==35]=1
arr[arr==46]=0
print arr
 
buf = np.zeros(arr.shape)-1
# -1 - unchecked
# 0 - no area
# 1..n - area number
 
def mark_area(arr, buf, i, j, mark):
    if i < 0 or j < 0 or i >= arr.shape[0] or j >= arr.shape[1]:
        return False
    if not arr[i, j]:
        return False
    if buf[i, j] == -1:
        buf[i, j] = mark
        mark_area(arr, buf, i-1, j, mark)
        mark_area(arr, buf, i+1, j, mark)
        mark_area(arr, buf, i, j-1, mark)
        mark_area(arr, buf, i, j+1, mark)
        return True
    else:
        return False
 
counter = 1
for i in xrange(arr.shape[0]):
    for j in xrange(arr.shape[1]):
        if mark_area(arr, buf, i, j, counter):
            counter += 1
 
print buf
print np.max(buf)
n = int(raw_input().split(' ', 1)[0])
field = [ list(raw_input()) for _ in xrange(n) ]
m = len(field[0])
 
beds = 0
 
for x in xrange(n):
    for y in xrange(m):
        if field[x][y] == '#':
            beds += 1
            stack = [ (x, y) ]
            while len(stack) != 0:
                x, y = stack.pop()
                if x >= 0 and x < n and y >= 0 and y < m and field[x][y] == '#':
                    field[x][y] = '.'
                    stack.append((x + 1, y))
                    stack.append((x - 1, y))
                    stack.append((x, y - 1))
                    stack.append((x, y + 1))
 
print(beds)

Leave a Comment