





def 		A_    (					_lowerCAmelCase							,       _lowerCAmelCase							,       _lowerCAmelCase							,       _lowerCAmelCase					)						->			bool:

 # 1. Validate that path exists between current and next vertices
 if graph[path[curr_ind - 1]][next_ver] == 0:
  return False

 # 2. Validate that next vertex is not already in path
 return not any(vertex == next_ver for vertex in path					)



def 		A_    (					_lowerCAmelCase							,       _lowerCAmelCase							,       _lowerCAmelCase					)						->			bool:

 # Base Case
 if curr_ind == len(_lowerCAmelCase					):
  # return whether path exists between current and starting vertices
  return graph[path[curr_ind - 1]][path[0]] == 1

 # Recursive Step
 for next_ver in range(0							,       len(_lowerCAmelCase					)					):
  if valid_connection(_lowerCAmelCase							,       _lowerCAmelCase							,       _lowerCAmelCase							,       _lowerCAmelCase					):
   # Insert current vertex  into path as next transition
   UpperCamelCase     : List[str]	     =       next_ver
   # Validate created path
   if util_hamilton_cycle(_lowerCAmelCase							,       _lowerCAmelCase							,       curr_ind + 1					):
    return True
   # Backtrack
   UpperCamelCase     : List[Any]	     =       -1
 return False



def 		A_    (					_lowerCAmelCase							,       _lowerCAmelCase = 0					)						->			list[int]:
 UpperCamelCase     : Optional[Any]	     =       [-1] * (len(_lowerCAmelCase					) + 1)
 # initialize start and end of path with starting index
 UpperCamelCase     : Any	     =       start_index
 # evaluate and if we find answer return path either return empty array
 return path if util_hamilton_cycle(_lowerCAmelCase							,       _lowerCAmelCase							,       1					) else []







class  A__       :  # Public class to implement a graph





      def __init__(			self	,							A_	,							A_	,							A_       ):
       '''simple docstring'''




       UpperCamelCase     : Optional[int]	     =       row
       UpperCamelCase     : Any	     =       col
       UpperCamelCase     : Optional[Any]	     =       graph





      def 	__UpperCamelCase(			self	,							A_	,							A_	,							A_       ):
       '''simple docstring'''




       return (
           0 <= i < self.ROW
           and 0 <= j < self.COL
           and not visited[i][j]
           and self.graph[i][j]
       )





      def 	__UpperCamelCase(			self	,							A_	,							A_	,							A_       ):
       '''simple docstring'''




       UpperCamelCase     : Any	     =       [-1, -1, -1, 0, 0, 1, 1, 1]  # Coordinate order
       UpperCamelCase     : Dict	     =       [-1, 0, 1, -1, 1, -1, 0, 1]
       UpperCamelCase     : Any	     =       True  # Make those cells visited
       for k in range(8       ):
        if self.is_safe(i + row_nbr[k]	,							j + col_nbr[k]	,							A_       ):
         self.diffs(i + row_nbr[k]	,							j + col_nbr[k]	,							A_       )





      def 	__UpperCamelCase(			self       ):  # And finally, count all islands.
       '''simple docstring'''




       UpperCamelCase     : str	     =       [[False for j in range(self.COL       )] for i in range(self.ROW       )]
       UpperCamelCase     : int	     =       0
       for i in range(self.ROW       ):
        for j in range(self.COL       ):
         if visited[i][j] is False and self.graph[i][j] == 1:
          self.diffs(A_	,							A_	,							A_       )
          count += 1
       return count
