算法训练 Day30

文章介绍了如何使用回溯法解决两个经典问题:重新安排旅行行程,确保没有死循环,以及N皇后问题,确保皇后在棋盘上互不冲突。在行程问题中,通过建立机票映射并排序,从JFK出发进行深度优先搜索。在N皇后问题中,利用回溯检查每一步是否合法,包括列、对角线上的冲突。
摘要由CSDN通过智能技术生成

332.重新安排行程

几个难点:

  1. 一个行程中,如果航班处理不好容易变成一个圈,成为死循环
  2. 有多种解法,字母序靠前排在前面,让很多同学望而退步,如何该记录映射关系呢 ?
  3. 使用回溯法(也可以说深搜) 的话,那么终止条件是什么呢?
  4. 搜索的过程中,如何遍历一个机场所对应的所有机场.
class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        tickets_dict = defaultdict(list)
        for ticket in tickets:
            tickets_dict[ticket[0]].append(ticket[1])
 

        for item in tickets_dict:
            tickets_dict[item].sort()

        path = ['JFK']
        def backtracking(startindex):
            if len(path) == len(tickets) + 1:
                return path
            for i in tickets_dict[startindex]:
                end = tickets_dict[startindex].pop(0)
                path.append(end)
                
                if backtracking(end): return path
                
                path.pop()
                tickets_dict[startindex].append(end)
        backtracking('JFK')
        return path

51. N皇后

解题细节:is_valid function

  1. 不能同行
  2. 不能同列
  3. 不能同斜线 (45度和135度角)
class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        board = [['.'] * n for _ in range(n)]
        res = []
        def backtracking(board,n,row):
            if row == n:
                path = []
                for item in board:
                    path_row = ''.join(item)
                    path.append(path_row)
                res.append(path)
           
        
            for i in range(n):
                
                if not is_valid(board,row,i):
                    continue
                
                board[row][i] = 'Q'
                backtracking(board,n,row+1)
                board[row][i] = '.'
        

        def is_valid(board,row,indx):
            #判断同一列是否冲突
            for i in range(len(board)):
                if board[i][indx] == 'Q':
                    return False
            # 判断左上角是否冲突
            i = row -1
            j = indx -1
            while i>=0 and j>=0:
                if board[i][j] == 'Q':
                    return False
                i -= 1
                j -= 1
            # 判断右上角是否冲突
            i = row - 1
            j = indx + 1
            while i>=0 and j < len(board):
                if board[i][j] == 'Q':
                    return False
                i -= 1
                j += 1
            return True
            
        backtracking(board,n,0)
        return res

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值