Either use same matrix to mark already counted square or use a new matrix.
matrix: 0 2 1 0 0 1 0 1 1 1 0 1 0 1 0 1
pond-size(a):
if a == null || a.length() == 0 || a[0].length() == 0:
throw
m = a.length()
n = a[0].length()
size = 0
for i = 0, i < m, i++:
for j = 0, j < n, j++:
size += pond-size(a, i, m, j, n)
// unmark
if size > 0:
for i = 0, i < m, i++:
for j = 0, j < n, j++:
if a[i][j] < 0:
a[i][j] = 0
return size
pond-size(a, i, m, j, n):
if i < 0 || i >= m:
return 0
if j < 0 || j >= n:
return 0
if a[i][j] != 0:
return 0
// mark to avoid double counting
a[i][j] = -1
size = 1
+ pond-size(a, i-1, m, j, n)
+ pond-size(a, i+1, m, j, n)
+ pond-size(a, i, m, j-1, n)
+ pond-size(a, i, m, j+1, n)
+ pond-size(a, i-1, m, j-1, n)
+ pond-size(a, i-1, m, j+1, n)
+ pond-size(a, i+1, m, j-1, n)
+ pond-size(a, i+1, m, j+1, n)
// cannot unmark here
return size
[Hat tip to ctci]
No comments:
Post a Comment