class Solution:
    def find_index(self, search_list, symbol):
        result_list = []
        for i, v in enumerate(search_list):
            for j, v2 in enumerate(v):
                if v2 == symbol:
                    result_list.append((i, j))
        return result_list

    def next_index(self, current_index, previous_index):
        i, j = current_index
        all_neighbours = [(i-1, j), (i, j+1), (i+1, j), (i, j-1)]
        return [x for x in all_neighbours if 0<=x[0]<=3 and 0<=x[1]<=3 and x!=previous_index]
    
    def find_word(self, word, start_position):
        previous_position = [start_position,]
        def check_matrix(word, start_position, next_letter=1):
            print('previous_position')
            print(previous_position)
            #nonlocal previous_position
            for neighbour_position in self.next_index(start_position, previous_position[-1]):
                i, j = neighbour_position
                print('position')
                print(neighbour_position)
                print('next_letter')
                print(next_letter)
                if board[i][j] == word[next_letter]:
                    print('board[i][j]')
                    print(board[i][j])
                    print('word[next_letter]')
                    print(word[next_letter])
                    print('next_letter')
                    print(next_letter)
                    print('len(word)-1')
                    print(len(word)-1)

                    if next_letter == len(word)-1:
                        return True
                    else:
                        print(board[i][j])
                        next_letter += 1 
                        check_matrix(word, neighbour_position, next_letter)
                        previous_position.append(neighbour_position)
                else:
                    continue
            return False
        return check_matrix(word, start_position)
        #check_matrix(word, start_position)

    def findWords(self, board, words):
        result_words = []
        for word in words:
            print('-------------')
            print('word')
            print(word)
            print('word[0]')
            print(word[0])
            for start in self.find_index(board, word[0]):
                print('start')
                print(start)
                print('find_word')
                print(self.find_word(word, start))
                if self.find_word(word, start):
                    result_words.append(word)
        return result_words
        
board = [["o","a","a","n"],["e","t","a","e"],["i","h","k","r"],["i","f","l","v"]]
words = ["oath","pea","eat","rain"]

Solution().findWords(board, words)