经典回溯算法解析

八皇后问题

要求在8×8的国际象棋棋盘上放置8个皇后,使得它们互不攻击(即任意两个皇后不在同一行、同一列或同一对角线上)。

python 复制代码
# 统计所有合法摆放方式的数量
def eight_queens():
    count = 0  # 统计合法解的数量
    # 初始化占用标记数组(索引1-8有效,0弃用)
    row_use = [False] * 9  # 行占用(实际按行递归,这个数组其实用不上,可删)
    col_use = [False] * 9  # 列占用
    zhu_use = [False] * 17  # 主对角线
    fu_use = [False] * 17  # 副对角线

    # 回溯函数:处理第row行的皇后放置(必须嵌套在eight_queens内,否则访问不到外部变量)
    def back(row):
        nonlocal count
        # 终止条件:8行全部放置完成,找到一个合法解
        if row > 8:
            count += 1
            return

        # 遍历当前行的所有列(1-8,col=扣)
        for col in range(1, 9):
            # 核心判断:列、主对角线、副对角线都未被占用
            if not col_use[col] and not zhu_use[row + col] and not fu_use[row - col + 8]:
                # 标记占用(放置皇后)
                col_use[col] = True
                zhu_use[row + col] = True
                fu_use[row - col + 8] = True

                # 递归处理下一行
                back(row + 1)

                # 回溯:取消标记(移除皇后)
                col_use[col] = False
                zhu_use[row + col] = False
                fu_use[row - col + 8] = False

    # 从第1行开始回溯(调用回溯函数,缩进必须在eight_queens内)
    back(1)
    # 返回最终统计结果
    return count


# 定义main函数,调用eight_queens并输出结果
def main():
    result = eight_queens()
    print(result)  # 输出:92


# 执行入口
if __name__ == "__main__":
    main()

数独填数问题

37. 解数独 - 力扣(LeetCode)

数独是一种逻辑游戏,需要在9x9的格子中填入数字1-9,满足以下条件:

  • 每一行必须包含数字1-9且不重复。
  • 每一列必须包含数字1-9且不重复。
  • 每个3x3的小宫格(共9个)必须包含数字1-9且不重复。
python 复制代码
# 检查(x,y)位置填入num是否合法
def is_valid(board, x, y, num):
    # 检查行
    for i in range(9):
        if board[x][i] == num:
            return False
    # 检查列
    for i in range(9):
        if board[i][y] == num:
            return False
    # 检查3×3宫
    sx = x // 3 * 3
    sy = y // 3 * 3
    for i in range(3):
        for j in range(3):
            if board[sx+i][sy+j] == num:
                return False
    return True

# DFS回溯求解数独
def dfs(board):
    for i in range(9):
        for j in range(9):
            if board[i][j] == 0:
                for num in range(1, 10):
                    if is_valid(board, i, j, num):
                        board[i][j] = num
                        if dfs(board):
                            return True
                        board[i][j] = 0  # 回溯
                return False
    return True

# 主程序
if __name__ == "__main__":
    board = []
    # 读取9行空格分隔的数独输入(0表示空白)
    for _ in range(9):
        line = input().strip()
        row = list(map(int, line.split()))
        board.append(row)
    # 求解并按标准格式输出
    if dfs(board):
        for row in board:
            print(' '.join(map(str, row)))
    else:
        print("无解")
核心点 数独 / 皇后问题通用逻辑
回溯核心 「试填→验证→递归→回溯」:试选一个值→验证合法性→递归填下一个→错了就回退(恢复现场)
终止条件 所有位置填完(数独无 0 / 皇后放满 N 个)→返回 True;某位置无合法值→返回 False 触发回溯
核心价值 暴力枚举的优化:提前剪枝(非法值不递归),避免无效计算,适配蓝桥杯中等难度算法题
相关推荐
石榴树下的七彩鱼1 小时前
图片去水印 API 详解:从单图到批量自动化去水印(附 Python/JS/PHP 完整教程)
python·自动化·图片处理·图片去水印·石榴智能·api教程
BirdenT2 小时前
20260519紫题训练
c++·算法
Li emily7 小时前
解决了加密货币api多币种订阅时的数据乱序问题
人工智能·python·api·fastapi
csdn_aspnet7 小时前
C语言 Lomuto分区算法(Lomuto Partition Algorithm)
c语言·开发语言·算法
2301_781571427 小时前
Golang格式化输出占位符都有什么_Golang fmt占位符教程【通俗】
jvm·数据库·python
asdzx678 小时前
使用 Python 为 PDF 添加页码 (详细教程)
python·pdf·页码
谙弆悕博士8 小时前
【附C源码】从零实现C语言堆数据结构:原理、实现与应用
c语言·数据结构·算法··数据结构与算法
AI技术控8 小时前
《Transformers are Inherently Succinct》论文解读:从“能表达什么”到“多紧凑地表达”
人工智能·python·深度学习·机器学习·自然语言处理
金融大 k10 小时前
Python 全球指数监控面板:TickDB + REST + WebSocket 完整方案
python·websocket
啊哈哈1213810 小时前
系统设计复盘:为什么 Agent 的 ReAct 循环必须内嵌确定性保护层——以 FitMind 健康助手的路由与步骤控制为例
人工智能·python·react