#! /usr/bin/env python3 # counts the number of regions in a matrix # vertically and horizontally connected # e.g. # [1, 0, 1, 1] # [0, 1, 0, 0] # [1, 1, 0, 1] # has 4 regions class Patch(object): def __init__(self, visited, value): self.visited = visited self.value = value def __repr__(self): return "visited = %s, value = %s" % (self.visited, self.value) def initialize(region): for row in region: yield [Patch(visited=False, value=field) for field in row] testregion = list(initialize([ [True, False, True, True], [False, True, False, False], [True, True, False, True] ])) def exploreField(region, x, y): # check if we've reached the edge of the matrix if (x < 0 or y < 0): return True try: if region[y][x].visited or not region[y][x].value: return True except IndexError: return True region[y][x].visited = True exploreField(region, y+1, x) exploreField(region, y-1, x) exploreField(region, y, x+1) exploreField(region, y, x-1) count = 0 for y, row in enumerate(testregion): for x, patch in enumerate(row): # if a patch is both unvisited and true # this means exploreField will eliminate it # so it counts as one region if not patch.visited and patch.value: count += 1 exploreField(testregion, x, y) print(count)