def backtracking_helper(board):
    """ Does the DFS and checks constraints while doing that"""

    if board.is_goal():
        global WINNING_BOARD
        import copy

        WINNING_BOARD = copy.deepcopy(board)
        return True

    import copy

    old_board = copy.deepcopy(board)
    cordinates = board.get_next_cell_fn()

    if cordinates is None:
        return False

    for value in range(1, board.size + 1):

        if board.insert(cordinates[0], cordinates[1], value):
            if backtracking_helper(board):
                return True
        board = copy.deepcopy(old_board)

    return False
def backtracking_mrv_cp_helper(board):
    """ Does the DFS and checks constraints while doing that"""
    if board.is_goal():
        global WINNING_BOARD
        import copy
        WINNING_BOARD = copy.deepcopy(board)
        return True
    import copy
    old_board = copy.deepcopy(board)
    result = board.get_next_cell_fn()

    if result is None:
        return False

    for value in result[1]:
        
        if board.insert(result[0][0],result[0][1],value):
            if backtracking_mrv_cp_helper(board):
                return True
        board = copy.deepcopy(old_board)

    return False
def backtracking_helper(board):
    """ Does the DFS and checks constraints while doing that"""

    if board.is_goal():
        global WINNING_BOARD
        import copy
        WINNING_BOARD = copy.deepcopy(board)
        return True

    import copy
    old_board = copy.deepcopy(board)
    cordinates = board.get_next_cell_fn()

    if cordinates is None:
        return False

    for value in range(1,board.size+1):
        
        if board.insert(cordinates[0],cordinates[1],value):
            if backtracking_helper(board):
                return True
        board = copy.deepcopy(old_board)

    return False
def backtracking_mrv_cp_helper(board):
    """ Does the DFS and checks constraints while doing that"""
    if board.is_goal():
        global WINNING_BOARD
        import copy

        WINNING_BOARD = copy.deepcopy(board)
        return True
    import copy

    old_board = copy.deepcopy(board)
    result = board.get_next_cell_fn()

    if result is None:
        return False

    for value in result[1]:

        if board.insert(result[0][0], result[0][1], value):
            if backtracking_mrv_cp_helper(board):
                return True
        board = copy.deepcopy(old_board)

    return False