首页 > 编程语言 >Python回溯算法

Python回溯算法

时间:2024-08-05 23:20:12浏览次数:13  
标签:return Python range 算法 board 回溯 col row

回溯算法

回溯算法是一种系统的搜索算法,用于解决诸如排列组合、子集生成、图的路径、棋盘问题等问题。其核心思想是通过递归尝试各种可能的解决方案,遇到不满足条件的解时则回退(回溯),继续尝试其他可能性,直到找到所有的解决方案或确认无解。

主要步骤:

  1. 选择路径:在当前步骤选择一个可能的路径或选项。
  2. 约束检查:检查当前选择是否满足问题的约束条件。如果不满足,则回溯。
  3. 递归探索:对当前选择的路径进行递归探索,继续尝试后续步骤。
  4. 回溯:如果当前路径或选择无法导致有效解,则回退到上一步,尝试其他可能的路径或选择。

1.生成所有子集

给定一个集合 [1, 2, 3],我们需要生成这个集合的所有可能的子集。

def backtrack(start, path, result, nums):
    # 将当前路径加入结果中
    result.append(path[:])
    
    # 从start位置开始,尝试添加更多的元素到路径中
    for i in range(start, len(nums)):
        path.append(nums[i])  # 做选择
        backtrack(i + 1, path, result, nums)  # 递归调用
        path.pop()  # 撤销选择(回溯)

def subsets(nums):
    result = []
    backtrack(0, [], result, nums)
    return result

# 示例
nums = [1, 2, 3]
all_subsets = subsets(nums)
for subset in all_subsets:
    print(subset)

2.数独问题

根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫(3*3)内的数字均含1-9,不重复。

def is_valid(board, row, col, num):
    # 检查行
    for i in range(9):
        if board[row][i] == num:
            return False

    # 检查列
    for i in range(9):
        if board[i][col] == num:
            return False

    # 检查3x3子网格
    start_row, start_col = 3 * (row // 3), 3 * (col // 3)
    for i in range(start_row, start_row + 3):
        for j in range(start_col, start_col + 3):
            if board[i][j] == num:
                return False

    return True


def solve_sudoku(board):
    for row in range(9):
        for col in range(9):
            if board[row][col] == 0:
                for num in range(1, 10):  # 尝试放置数字1-9
                    if is_valid(board, row, col, num):
                        board[row][col] = num
                        if solve_sudoku(board):
                            return True
                        board[row][col] = 0  # 回溯
                return False
    return True


# 示例数独问题(0表示空位)
board = [
    [5, 3, 0, 0, 7, 0, 0, 0, 0],
    [6, 0, 0, 1, 9, 5, 0, 0, 0],
    [0, 9, 8, 0, 0, 0, 0, 6, 0],
    [8, 0, 0, 0, 6, 0, 0, 0, 3],
    [4, 0, 0, 8, 0, 3, 0, 0, 1],
    [7, 0, 0, 0, 2, 0, 0, 0, 6],
    [0, 6, 0, 0, 0, 0, 2, 8, 0],
    [0, 0, 0, 4, 1, 9, 0, 0, 5],
    [0, 0, 0, 0, 8, 0, 0, 7, 9]
]

solve_sudoku(board)
for row in board:
    print(row)

3.八皇后问题

在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

def is_safe(board, row, col):
    # 检查列是否有皇后
    for i in range(row):
        if board[i][col] == 1:
            return False

    # 检查左上对角线是否有皇后
    for i, j in zip(range(row, -1, -1), range(col, -1, -1)):
        if board[i][j] == 1:
            return False

    # 检查右上对角线是否有皇后
    for i, j in zip(range(row, -1, -1), range(col, len(board), 1)):
        if board[i][j] == 1:
            return False

    return True


def solve_nqueens(board, row):
    # 如果所有行都放置了皇后,表示找到一个解决方案
    if row >= len(board):
        return 1

    count = 0
    # 尝试在当前行的每一列放置皇后
    for col in range(len(board)):
        if is_safe(board, row, col):
            board[row][col] = 1  # 放置皇后
            count += solve_nqueens(board, row + 1)  # 递归尝试放置下一行的皇后
            board[row][col] = 0  # 回溯,移除皇后

    return count


def main():
    n = 8
    board = [[0] * n for _ in range(n)]  # 初始化8x8棋盘
    total_solutions = solve_nqueens(board, 0)  # 计算所有解决方案的数量
    print(f"Total solutions: {total_solutions}")


if __name__ == "__main__":
    main()

标签:return,Python,range,算法,board,回溯,col,row
From: https://www.cnblogs.com/rustling/p/18344223

相关文章

  • Studying-代码随想录训练营day59| dijkstra(堆优化版)精讲、Bellman_ford 算法精讲
    第59天,dijkstra算法的优化版本,以及Bellman_ford算法......
  • [python]使用gunivorn部署fastapi服务
    前言Gunicorn是一种流行的WSGIHTTP服务器,常用于部署Django和Flask等PythonWeb框架程序。Gunicorn具有轻量级、高稳定性和高性能等特性,可以轻易提高PythonWSGIApp运行时的性能。基本原理Gunicorn采用了pre-fork模型,也就是一个工作进程和多个worker进程的工作模式。在这个模......
  • python十六进制编辑器
    源代码:importtkinterastkfromtkinterimportfiledialogimportstructimportbinasciiimportosclassHexEditor:def__init__(self,master):self.master=masterself.master.title("十六进制编辑器")self.master.configure(bg......
  • python项目学习 mediapipe手势识别 opencv可视化显示
    importcv2importmediapipeimportnumpydefget_angle(vector1,vector2):#角度计算angle=numpy.dot(vector1,vector2)/(numpy.sqrt(numpy.sum(vector1*vector1))*numpy.sqrt(numpy.sum(vector2*vector2)))#cos(angle)=向量的点乘/向量的模angle=nump......
  • 【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
    摘要气象数据分析在各行各业中扮演着重要的角色,尤其对于农业、航空、海洋、军事、资源环境等领域。在这些领域中,准确的气象数据可以对预测未来的自然环境变化和采取行动来减轻负面影响的决策起到至关重要的作用。本系统基于PythonFlask框架,通过对气象数据的分析和处理来提供......
  • Python-MNE全套教程(官网翻译)-入门01:概述篇
    目的以牺牲深度为代价进行入门学习,简易学习基本方法开始导入相关库:#License:BSD-3-Clause#CopyrighttheMNE-Pythoncontributors.importnumpyasnpimportmne加载数据MNE-Python数据结构式基于fif格式的,但是对于其他格式也有阅读方法,如https://mne.tools/s......
  • Python-MNE全套教程(官网翻译)-入门05:关于传感器位置
    本教程描述了如何读取和绘制传感器位置,以及MNE-Python如何处理传感器的物理位置。像往常一样,我们将从导入我们需要的模块开始:frompathlibimportPathimportmatplotlib.pyplotaspltimportnumpyasnpimportmne关于montage和layout(蒙太奇和传感器布局)montage......
  • Codeforces Round 963 (Div. 2) A - C 详细题解(思路加代码,C++,Python) -- 来自灰名
    比赛链接:Dashboard-CodeforcesRound963(Div.2)-Codeforces之后有实力了再试试后面的题目,现在要做那些题,起码要理解一个多小时题目A:链接:Problem-A-Codeforces题目大意理解:        极少数不考翻译能读懂的cf题目(bushi)每个测试用例第一行一个n,......
  • 【Playwright+Python】系列教程(七)使用Playwright进行API接口测试
    playwright也是可以做接口测试的,但个人觉得还是没有requests库强大,但和selenium相比的话,略胜一筹,毕竟支持API登录,也就是说可以不用交互直接调用接口操作了。怎么用既然是API的测试了,那肯定就别搞UI自动化那套,搞什么浏览器交互,那叫啥API测试,纯属扯淡。也不像有些博主更懒,直接贴......
  • 快速解密哈希算法利器Hasher:解密MD5、SHA256、SHA512、RIPEMD160等最佳工具
    文章目录一、工具概述1.1主要功能点1.2支持多种哈希算法二、安装方法三、使用教程四、结语一、工具概述Hasher是一个哈希破解工具,支持多达7种类型的哈希算法,包括MD4、MD5、SHA1、SHA224、SHA256、SHA384、SHA512等。它具有自动检测哈希类型、支持Windows......