python 回溯法 子集树模板 系列 —— 1、8 皇后问题

简介: 问题8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。分析为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的皇后可以放置于第0、1、2、...、7列,我们认为每一行的皇后有8种状态。

问题

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

img_79fbb65a2ad2dadbf8a0c45ae3c892db.jpg

分析

为了简化问题,考虑到8个皇后不同行,则每一行放置一个皇后,每一行的皇后可以放置于第0、1、2、...、7列,我们认为每一行的皇后有8种状态。那么,我们只要套用子集树模板,从第0行开始,自上而下,对每一行的皇后,遍历它的8个状态即可。

代码

'''
8皇后问题
'''

n = 8 
x = []  # 一个解(n元数组)
X = []  # 一组解


# 冲突检测:判断 x[k] 是否与前 x[0~k-1] 冲突
def conflict(k):
    global x
    
    for i in range(k):                              # 遍历前 x[0~k-1]
        if x[i]==x[k] or abs(x[i]-x[k])==abs(i-k):  # 判断是否与 x[k] 冲突
            return True
    return False

            
# 套用子集树模板
def queens(k): # 到达第k行
    global n, x, X
    
    if k >= n:         # 超出最底行
        #print(x)
        X.append(x[:]) # 保存(一个解),注意x[:]
    else:
        for i in range(n):  # 遍历第 0~n-1 列(即n个状态)
            x.append(i)     # 皇后置于第i列,入栈
            if not conflict(k): # 剪枝
                queens(k+1)
            x.pop()         # 回溯,出栈
                
                
# 解的可视化(根据一个解x,复原棋盘。'X'表示皇后)
def show(x):
    global n
    
    for i in range(n):
        print('. ' * (x[i]) + 'X ' + '. '*(n-x[i]-1))


# 测试
queens(0) # 从第0行开始

print(X[-1], '\n')
show(X[-1])

效果图

img_4b8b715d4d96bd07fbddb142c0849324.jpg

目录
相关文章
|
Python 机器学习/深度学习 安全
python 回溯法 子集树模板 系列 —— 19、野人与传教士问题
问题 在河的左岸有N个传教士、N个野人和一条船,传教士们想用这条船把所有人都运过河去,但有以下条件限制: (1)修道士和野人都会划船,但船每次最多只能运M个人; (2)在任何岸边以及船上,野人数目都不能超过修道士,否则修道士会被野人吃掉。
1564 0
|
Python
python 回溯法 记录
一直不是太理解回溯法,这几天集中学习了一下,记录如下。 回溯法有“通用的解题法”之称。 1.定义:  也叫试探法,它是一种系统地搜索问题的解的方法。 2.基本思想:  从一条路往前走,能进则进,不能进则退回来,换一条路再试。
3173 0
|
3月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
287 102
|
3月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
314 104
|
3月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
260 103
|
3月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
193 82
|
2月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
179 3
|
2月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
420 3
|
2月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
264 3

推荐镜像

更多