[image from TH]
//matrix i---->m j | | n- For every i,j square in matrix, try if the word matches.
- For any i,j square, the word[k] should match a[i,j] and any one of the neighboring 8 squares (excluding already matched squares) should match word[k+1].
indexs find(a, word):
if a == null || a.length() == 0 || a[0].length() == 0:
throw
if word == null || word == "":
throw
m = a.length()
n = a[0].length()
for i = 0, i < m, i++:
for j = 0, j < n, j++:
if (a, i, j, m, n, word, squares, k: 0):
return convert(squares, m)
return convert(squares, m)
// return true if word is present starting with kth char in word till end
bool (a, i, j, m, n, word, squares, k):
//this check needs to be before i, j check for a word ending in corner
if k == word.length():
return true
if !((0 <= i < m) && (0 <= j < n)):
return false
if a[i][j] != word[k]:
return false
ijkey = flatten(i, j, m)
if squares.has(ijkey):
return false
squares.add(ijkey)
isnextmatch =
(a, i-1, j, m, n, word, squares, k+1)
|| (a, i+1, j, m, n, word, squares, k+1)
|| (a, i, j+1, m, n, word, squares, k+1)
|| (a, i, j-1, m, n, word, squares, k+1)
|| (a, i-1, j-1, m, n, word, squares, k+1)
|| (a, i-1, j+1, m, n, word, squares, k+1)
|| (a, i+1, j-1, m, n, word, squares, k+1)
|| (a, i+1, j+1, m, n, word, squares, k+1)
if !isnextmatch:
squares.removelast()
return isnextmatch
// flattens i,j to an int
int flatten(i, j, m):
return j*m + i
// unflattens int to i,j
int, int unflatten(x, m):
return x/m, x%m
convert(squares, m):
for x in squares:
yield unflatten(x, m)
index:
i, j
[Hat tip to SM, TH]

No comments:
Post a Comment