首页 > 编程语言 >30天【代码随想录算法训练营34期】第七章 回溯算法part06 (● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独 ● 总结 )

30天【代码随想录算法训练营34期】第七章 回溯算法part06 (● 332.重新安排行程 ● 51. N皇后 ● 37. 解数独 ● 总结 )

时间:2024-04-18 15:34:41浏览次数:30  
标签:return 随想录 chessboard 51 self 算法 board col row

332.重新安排行程
木有看懂,没视频所以也没看懂

51. N皇后
自己写出来还是有难度的

class Solution:
    def solveNQueens(self, n: int) -> List[List[str]]:
        result = []  # 存储最终结果的二维字符串数组

        chessboard = ['.' * n for _ in range(n)]  # 初始化棋盘
        self.backtracking(n, 0, chessboard, result)  # 回溯求解
        return [[''.join(row) for row in solution] for solution in result]  # 返回结果集

    def backtracking(self, n: int, row: int, chessboard: List[str], result: List[List[str]]) -> None:
        if row == n:
            result.append(chessboard[:])  # 棋盘填满,将当前解加入结果集
            return

        for col in range(n):
            if self.isValid(row, col, chessboard):
                chessboard[row] = chessboard[row][:col] + 'Q' + chessboard[row][col+1:]  # 放置皇后
                self.backtracking(n, row + 1, chessboard, result)  # 递归到下一行
                chessboard[row] = chessboard[row][:col] + '.' + chessboard[row][col+1:]  # 回溯,撤销当前位置的皇后

    def isValid(self, row: int, col: int, chessboard: List[str]) -> bool:
        # 检查列
        for i in range(row):
            if chessboard[i][col] == 'Q':
                return False  # 当前列已经存在皇后,不合法

        # 检查 45 度角是否有皇后
        i, j = row - 1, col - 1
        while i >= 0 and j >= 0:
            if chessboard[i][j] == 'Q':
                return False  # 左上方向已经存在皇后,不合法
            i -= 1
            j -= 1

        # 检查 135 度角是否有皇后
        i, j = row - 1, col + 1
        while i >= 0 and j < len(chessboard):
            if chessboard[i][j] == 'Q':
                return False  # 右上方向已经存在皇后,不合法
            i -= 1
            j += 1

        return True  # 当前位置合法

37. 解数独
很有道理,但是一脱离模板就不会走路了

class Solution:
    def solveSudoku(self, board: List[List[str]]) -> None:
        self.backtracking(board)
    
    def backtracking(self, board):
        for i in range(len(board)):
            for j in range(len(board[0])):
                if board[i][j] != '.':
                    continue
                for k in range(1, 10):
                    if self.isValid(i, j, k, board):
                        board[i][j] = str(k)
                        if self.backtracking(board):
                            return True
                        board[i][j] = '.'
                return False
        return True

        
    def isValid(self, row, col, num, board):
        for i in range(9):
            if board[row][i] == str(num):
                return False
            if board[i][col] == str(num):
                return False

        start_col = (col // 3)*3
        start_row = (row // 3)*3

        for i in range(start_row, start_row+3):
            for j in range(start_col, start_col+3):
                if board[i][j] == str(num):
                    return False
        return True

总结

标签:return,随想录,chessboard,51,self,算法,board,col,row
From: https://www.cnblogs.com/miramira/p/18143612

相关文章

  • Dijkstra算法
    单源最短路算法,不能处理负环,朴素版时间复杂度\(O(n^2)\),堆优化版时间复杂度\(O(nlogn)\)。Dijkstra算法的流程是:将所有的节点分为A、B的两个集合,一开始A集合中只有起点,其他的节点在B集合。定义B中的节点与A的距离:若邻接A中的结点,则距离为边权;反之距离无穷大。1.找到与A距离最小......
  • 基于深度学习的停车场车辆检测算法matlab仿真
    1.算法运行效果图预览   上图测试结果如下图所示:   2.算法运行软件版本matlab2022a 3.算法理论概述     随着城市交通管理和智慧停车系统的快速发展,停车场车辆检测已成为实现高效车位管理、智能计费的关键技术之一。深度学习,尤其是基于卷积神经网络(CN......
  • 051、宣州谢朓楼饯别校书叔云
    051、宣州谢朓楼饯别校书叔云唐●李白弃我去者昨日之日不可留,乱我心者今日之日多烦忧。长风万里送秋雁,对此可以酣高楼。蓬莱文章建安骨,中间小谢又清发。俱怀逸兴壮思飞,欲上青天览明月。抽刀断水水更流,举杯销愁愁更愁。人生在世不称意,明朝散发弄扁舟。 【现代诗意译】......
  • 数据结构与算法
    1数据结构1.1动态数组①数组特点存储特点:连续存储优点:查找块,访问元素快缺点:插入、删除元素效率低②实现思路1.初始化:malloc()动态分配内存区域2.扩展长度:realloc()重新调整内存区域大小3.插入元素:插入位置,后面所有元素后移4.删除元素:删除位置,后面所有元......
  • 先进先出算法
    一、意义目的解决多个多个呼叫一个应答问题。如何排队,如何出队。常用于缓存多个请求,保持队列,先进先出。好处是有顺序,但是可以结合实际,比如位置比较近要先出,可以将“先进先出”作为排队出队子算法,再去排序,达到效率最高。二、原理:使用数组改变下标方式存入,出栈把后面变量一个......
  • 复杂网络社区发现算法聚类分析全国电梯故障数据和可视化:诊断电梯“安全之殇”|附代码
    参考原文:http://tecdat.cn/?p=2186最近我们被客户要求撰写关于复杂网络社区发现算法的研究报告,包括一些图形和统计输出。物业工程肩负着维持项目各类设施设备的正常运作,保障全体业主的正常生活,令物业保值升值,是项目的心脏部门。拓端数据(tecdat)研究人员根据全国电梯故障上报汇总......
  • 29天【代码随想录算法训练营34期】第七章 回溯算法part05 (491.递增子序列 * 46.全排
    491.递增子序列如果在最前面加一个uset=set(),这个就是给这一层一个usedset,很好用,不错classSolution:deffindSubsequences(self,nums:List[int])->List[List[int]]:result=[]self.backtracking(nums,[],result,0)returnresult......
  • 算法
    冒泡:选择:插入:希尔:归并:快速:堆:计数:桶:基数:......
  • js 搜索查找算法
    线性查找线性查找是最简单的一种查找算法,它的基本思想是从头到尾遍历待查找的数据集,找到对应的元素,时间复杂度为O(n)。代码实现:functionlinearSearch(arr,target){for(leti=0;i<arr.length;i++){if(arr[i]===target){returni;......
  • KMP算法 Java实现
    Problem:28.找出字符串中第一个匹配项的下标目录解题方法思路构建next数组回溯查找复杂度Code解题方法构建next串回溯查找next串,最后下标思路通过最大前缀后缀能找到下一次未查找到后要回溯的位置构建next数组无论如何第一个数的下一次回溯位置肯定是0,因此next[......