332.重新安排行程
给定一个机票的字符串二维数组 [from, to],子数组中的两个成员分别表示飞机出发和降落的机场地点,对该行程进行重新规划排序。所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的先生,所以该行程必须从 JFK 开始.
思路:1.出发机场和目的地机场可以用defaultdict(list)装,key是出发机场,value是目的地机场列表。2. 由于行程可能变成一个圈,为了避免在圈内来回飞,我们将已经飞过的行程从字典中移除。3. 由于只要返回一个最小结果,可以在每一层循环前,对目的地排序,这样可以先遍历较小的结果。同时,只要得到一个正确的答案,就直接返回,无需再遍历下去。因此需要在枝条末端得到结果的时候,返回True。上层枝条得到这个True后,也往上返回True,直到跳出函数。

51. N皇后
n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。
思路:1. 从上往下一行一行填,一行只能填一个皇后。因此问题就转为在每一行,选择一个合适的列填入皇后。2. 定义一个isvalid函数,判断当前的选择是否合法。3. 问题就转为了一个标准的回溯算法。

37. 解数独
思路:和N皇后问题类似,对于board上的每一个格子,在0-9之间选择填入一个合法的数字。如果最后填满所有格子,则解题成功。1.定义一个isvalid函数。2. 对board逐行逐列遍历,空格子填入合法数字,然后进入下一层回溯去填下一个格子。3. 由于数独问题只要一个答案即可,因此在得道一个答案的时候,可以返回True,然后上一层回溯算法把这个True往上传,直到结束函数。4. 全部格子都填入合法数字,则为答案。

总结
以下是卡哥资料
今天这三道题都非常难,那么这么难的题,为啥一天做三道?
因为 一刷 也不求大家能把这么难的问题解决,所以 大家一刷的时候,就了解一下题目的要求,了解一下解题思路,不求能直接写出代码,先大概熟悉一下这些题,二刷的时候,随着对回溯算法的深入理解,再去解决如下三题。
大家今天的任务,其实是 对回溯算法章节做一个总结就行。
重点是看 回溯算法总结篇:
https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E6%80%BB%E7%BB%93.html
332.重新安排行程(可跳过)
https://programmercarl.com/0332.%E9%87%8D%E6%96%B0%E5%AE%89%E6%8E%92%E8%A1%8C%E7%A8%8B.html
51. N皇后(可跳过)
https://programmercarl.com/0051.N%E7%9A%87%E5%90%8E.html
视频讲解:https://www.bilibili.com/video/BV1Rd4y1c7Bq
37. 解数独(可跳过)
https://programmercarl.com/0037.%E8%A7%A3%E6%95%B0%E7%8B%AC.html
视频讲解:https://www.bilibili.com/video/BV1TW4y1471V
总结
https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E6%80%BB%E7%BB%93.html