from collections import deque
import numpy as np
asp = np.array([[ 2, 1, 8, 2],
[ 5, 4, 6, 4],
[ 3, 3, 3, 3],
[ 2, 1, 8, 2]]) #aspect
slp = np.array([[11,11,12,11],
[12,11,12,10],
[ 9, 9, 9,10],
[11,10,11,11]]) #slope
elv = np.array([[16,15,15,16],
[17,15,15,15],
[15,15,14,14],
[16,15,16,16]]) #elevation
criteria = np.stack((asp, slp, elv))
def floodfill(n, start):
def check(r, c):
return result[r, c] == 0 and np.array_equal(crit, criteria[:, r, c])
stack = deque([start])
crit = criteria [(slice(None), *start)]
while stack:
r, c = stack.popleft()
if result[r, c]: continue
result[r, c] = n
if r > 0 and check(r - 1, c):
stack.append((r - 1, c))
if r < result.shape[0] - 1 and check(r + 1, c):
stack.append((r + 1, c))
if c > 0 and check(r, c - 1):
stack.append((r, c - 1))
if c < result.shape[1] - 1 and check(r, c + 1):
stack.append((r, c + 1))
result = np.zeros_like(asp)
count = 1
it = np.nditer(result, flags=['multi_index'])
for x in it:
if x == 0:
floodfill(count, it.multi_index)
count += 1
print(result)
ZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKaW1wb3J0IG51bXB5IGFzIG5wCgphc3AgPSBucC5hcnJheShbWyAyLCAxLCA4LCAyXSwKICAgICAgICAgICAgICAgIFsgNSwgNCwgNiwgNF0sCiAgICAgICAgICAgICAgICBbIDMsIDMsIDMsIDNdLAogICAgICAgICAgICAgICAgWyAyLCAxLCA4LCAyXV0pICAjYXNwZWN0CnNscCA9IG5wLmFycmF5KFtbMTEsMTEsMTIsMTFdLAogICAgICAgICAgICAgICAgWzEyLDExLDEyLDEwXSwKICAgICAgICAgICAgICAgIFsgOSwgOSwgOSwxMF0sCiAgICAgICAgICAgICAgICBbMTEsMTAsMTEsMTFdXSkgICNzbG9wZQplbHYgPSBucC5hcnJheShbWzE2LDE1LDE1LDE2XSwKICAgICAgICAgICAgICAgIFsxNywxNSwxNSwxNV0sCiAgICAgICAgICAgICAgICBbMTUsMTUsMTQsMTRdLAogICAgICAgICAgICAgICAgWzE2LDE1LDE2LDE2XV0pICNlbGV2YXRpb24KCmNyaXRlcmlhID0gbnAuc3RhY2soKGFzcCwgc2xwLCBlbHYpKQoKZGVmIGZsb29kZmlsbChuLCBzdGFydCk6CiAgICBkZWYgY2hlY2sociwgYyk6CiAgICAgICAgcmV0dXJuIHJlc3VsdFtyLCBjXSA9PSAwIGFuZCBucC5hcnJheV9lcXVhbChjcml0LCBjcml0ZXJpYVs6LCByLCBjXSkKCiAgICBzdGFjayA9IGRlcXVlKFtzdGFydF0pCiAgICBjcml0ID0gY3JpdGVyaWEgWyhzbGljZShOb25lKSwgKnN0YXJ0KV0KICAgIHdoaWxlIHN0YWNrOgogICAgICAgIHIsIGMgPSBzdGFjay5wb3BsZWZ0KCkKICAgICAgICBpZiByZXN1bHRbciwgY106IGNvbnRpbnVlCiAgICAgICAgcmVzdWx0W3IsIGNdID0gbgogICAgICAgIGlmIHIgPiAwIGFuZCBjaGVjayhyIC0gMSwgYyk6CiAgICAgICAgICAgIHN0YWNrLmFwcGVuZCgociAtIDEsIGMpKQogICAgICAgIGlmIHIgPCByZXN1bHQuc2hhcGVbMF0gLSAxIGFuZCBjaGVjayhyICsgMSwgYyk6CiAgICAgICAgICAgIHN0YWNrLmFwcGVuZCgociArIDEsIGMpKQogICAgICAgIGlmIGMgPiAwIGFuZCBjaGVjayhyLCBjIC0gMSk6CiAgICAgICAgICAgIHN0YWNrLmFwcGVuZCgociwgYyAtIDEpKQogICAgICAgIGlmIGMgPCByZXN1bHQuc2hhcGVbMV0gLSAxIGFuZCBjaGVjayhyLCBjICsgMSk6CiAgICAgICAgICAgIHN0YWNrLmFwcGVuZCgociwgYyArIDEpKQoKCnJlc3VsdCA9IG5wLnplcm9zX2xpa2UoYXNwKQpjb3VudCA9IDEKaXQgPSBucC5uZGl0ZXIocmVzdWx0LCBmbGFncz1bJ211bHRpX2luZGV4J10pCmZvciB4IGluIGl0OgogICAgaWYgeCA9PSAwOgogICAgICAgIGZsb29kZmlsbChjb3VudCwgaXQubXVsdGlfaW5kZXgpCiAgICAgICAgY291bnQgKz0gMQoKcHJpbnQocmVzdWx0KQ==