代码随想录训练营Day30| 332.重新安排行程 51. N皇后 37. 解数独 总结

文章介绍了在LeetCode上的三个经典问题:332.重新安排行程、51.N皇后和37.解数独,分别使用回溯算法进行求解。提供了详细的Python代码实现,并通过DFS深度优先搜索来解决这些约束满足问题。
摘要由CSDN通过智能技术生成

目录

学习目标 

学习内容

332.重新安排行程

 51. N皇后 

 37. 解数独

总结  


学习目标 ​​​​​​​

  •  332.重新安排行程 
  •  51. N皇后 
  •  37. 解数独 
  •  总结 ​​​​​​​

学习内容

332.重新安排行程

332. 重新安排行程 - 力扣(LeetCode)icon-default.png?t=N3I4https://leetcode.cn/problems/reconstruct-itinerary/

class Solution:
    def findItinerary(self, tickets: List[List[str]]) -> List[str]:
        dic = {}
        n = len(tickets)
        for item in tickets:
            if item[0] not in dic:
                dic[item[0]] = [item[1]]
            else:
                dic[item[0]].append(item[1])
        for values in dic.values():
            values.sort()
        res = []
        def dfs(start,n):
            res.append(start)
            if n==0:
                return True
            if start not in dic:return False
            for i in range(len(dic[start])):
                end = dic[start][i]
                n-=1
                dic[start].pop(i)
                if dfs(end,n):
                    return True
                res.pop()
                n+=1
                dic[start].insert(i,end)
        dfs("JFK",n)
        return res

 51. N皇后 

51. N 皇后 - 力扣(LeetCode)icon-default.png?t=N3I4https://leetcode.cn/problems/n-queens/ 

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        res = []
        tmp = [["."]*n for _ in range(n)]
        def dfs(i):
            if i==n:
                ans = []
                for j in range(n):
                    ans.append("".join(tmp[j]))
                res.append(ans.copy())
                return
            for j in range(n):
                if is_could(i,j):
                    tmp[i][j]="Q"
                    dfs(i+1)
                    tmp[i][j]="."
        def is_could(i,j):
            for k in range(0,i):
                if tmp[k][j]=="Q":
                    return False
            # 左上
            k = 1
            while j-k>=0 and i-k>=0:
                if tmp[i-k][j-k]=="Q":
                    return False
                k+=1
            # 右上
            k = 1
            while j+k<n and i-k>=0:
                if tmp[i-k][j+k]=="Q":
                    return False
                k+=1
            return True
        dfs(0)
        return res

 37. 解数独

37. 解数独 - 力扣(LeetCode)icon-default.png?t=N3I4https://leetcode.cn/problems/sudoku-solver/

class Solution:
    def solveSudoku(self, board: List[List[str]]) -> None:
        """
        Do not return anything, modify board in-place instead.
        """
        def dfs(board):
            for i in range(9):
                for j in range(9):
                    if board[i][j]==".":
                        for k in range(1,10):
                            if is_could(i,j,str(k)):
                                board[i][j]=str(k)
                                if dfs(board):
                                    return True
                                board[i][j]="."
                        return False
            return True
        def is_could(i,j,k):
            for z in range(9):
                if  board[i][z]==k:
                    return False
            for z in range(9):
                if  board[z][j]==k:
                    return False
            for x in range(i//3*3,i//3*3+3):
                for y in range(j//3*3,j//3*3+3):
                    if board[x][y]==k:
                        return False
            return True
        dfs(board)

总结  

problems/回溯总结.md · programmercarl/leetcode-master(代码随想录出品) - Gitee.comicon-default.png?t=N3I4https://gitee.com/programmercarl/leetcode-master/blob/master/problems/%E5%9B%9E%E6%BA%AF%E6%80%BB%E7%BB%93.md

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值