递归算法——八皇后问题 python

article/2025/9/15 7:45:51

研究了一下午的八皇后算法,可算是搞明白了,为了避免以后忘记,还是写个博客吧!可能会跟其他文章有相似之处,最终还是希望能好好学习算法,都是经过自己思考后亲自写的代码,虽然过程比较艰难,我写了很多注释。

参考B站视频链接 :2021第十二届蓝桥杯青少组省赛Python第6题(八皇后问题)_哔哩哔哩_bilibili

目录

一、问题描述

二、解题思路

三、总体步骤

四、代码实现

寻找函数编写:

打印输出函数:

主调用函数:

测试结果:

个人心得


一、问题描述

有八个皇后,如何在8*8的棋盘上放置8个皇后,使得任意两个皇后都不在同一条横线、纵线或斜线上

二、解题思路

三、总体步骤

四、代码实现

寻找函数编写:

# row表示递归到第几行,初始从第0行开始,n表示棋盘规模n行n列,这个始终不变
def search(row, n):global count   # 声明全局变量for col in range(n):# 表示在同一条上对角线上:行号加列号相同;表示在同一条下对角线上:行号减列号相同,为了避免索引出现复数,用row-col+n-1if flag_y[col] == 0 and line_up[row+col] == 0 and line_do[row-col+n-1] == 0:# 如果该点所在的行、列、对角线都没有被标记,则该点可以占领place[row] = col    # 表示第row行的第col列被占领:例如place[0] = 1 表示第1行的第2个点被占领flag_y[col] = 1   # 占领后将该点所在 的列 标记为1line_up[row+col] = 1   # 该点所在的 上对角线 被标记为1line_do[row-col+n-1] = 1   # 该点所在的 下对角线 也标记为1if row < n-1:# 如果该行不是棋盘的最后一行,则继续递归调用,寻找下一行的占领点,行数row+1search(row+1, n)else:# 已经到了最后一行,则证明找到一组可行的八皇后摆放点count += 1printf(place, n)  # 将这个解的形状打印输出print(place)  # 输出该结果# 到这里已经找到一个解,在寻找下一个解之前,要将棋盘的标记清空flag_y[col] = 0line_up[row + col] = 0line_do[row-col+n-1] = 0

打印输出函数:

# 输出棋盘样式
def printf(pos, n):# 遍历n*n的棋盘格子for i in range(n):for j in range(n):if pos[i] == j:# 如果第i行的皇后放在了第j列上,就输出*表示皇后的位置print("*", end=" ")else:print('0', end=" ")print()

主调用函数:

if __name__ == '__main__':n = int(input("请输入棋盘的规模n\n"))  # 代表n*n棋盘count = 0  # 存储可行解的个数# 表示标记,初始标记都为0place = [0 for i in range(n)]  # 记录第几行的皇后放在第几列上flag_y = [0 for i in range(n)]  # 表示第i列是否被标记(占领)line_up = [0 for i in range(2 * n - 1)]  # 上对角线是否被标记,总共有2n-1条上对角线line_do = [0 for i in range(2 * n - 1)]  # 表示下对角线是否被标记,总共有2n-1条下对角线search(0, n)    # 从第0行开始寻找print("总共有{}种结果".format(count))

测试结果:

测试结果是正确的,如果是4*4的棋盘,总共有两个解;如果是8*8的棋盘,总共有92个解。

个人心得

理解算法一定不能急,每一步都要搞懂,网上关于这个题有很多种算法,我觉得只要抓住一种吃透就好。还有最近也看了很多博主对算法学习的看法,感觉自己收获了很多,最大的感触就是:语言并不是学习算法的障碍,用python写并不比用C、C++的人差,语言只是一个工具罢了,我们应该慢慢打破语言之间的壁垒,所以首先C、C++的代码也要看得懂,毕竟很多经典算法都是用这些编写的,算法核心思想都是一样的,参加比赛选一个自己喜欢的编程语言就好。


http://chatgpt.dhexx.cn/article/PBcijehi.shtml

相关文章

算法课设——八皇后问题

八皇后问题&#xff0c;是由国际象棋棋手马克斯贝瑟尔于1848年提出的问题&#xff0c;是回溯算法的典型案例。 问题表述为&#xff1a;在88格的国际象棋上摆放8个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上&#xff0c;…

八皇后问题(递归算法)

作者&#xff1a;非妃是公主 专栏&#xff1a;《笔记》《C》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 想必八皇后问题&#xff0c;学过C的老哥都已经有所了解了&#xff1a; 题目是&#xff1a;在一个…

C语言:八皇后问题----回溯算法

【问题引入】 在88格的国际象棋上摆放8个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上&#xff0c;问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解&#xff0c;后来有人用图…

算法学习笔记之三:八皇后问题(递归、回溯)

&#xff08;一&#xff09;题记 从去年下半年开始找工作&#xff0c;大大小小也被“鄙”试、“面”试了n多回了。说实话只怪自己并未对常见的笔试题、面试题进行准备&#xff0c;导致败下阵来。一门学问要想学透学精是需要时间的&#xff0c;慢慢来吧…… 第一次听到“八皇后…

【算法模板】dfs 八皇后问题

1.前言 本文将以经典的八皇后问题来解析dfs的主要思想。 2.题目 题目出处&#xff1a;活动 - AcWing 3.思路讲解 dfs的思想暗含树的历遍&#xff0c;主要步骤为&#xff1a; 判断是否搜索完毕---历遍寻找符合条件的元素---递归进入下一层搜索---还原现场 我们可以先分析这个问题…

八皇后递归算法

八皇后问题 &#xff1a;假设 將八个皇后放到国际象棋盘上&#xff0c;使其两两之间无法相互攻击。共有几种摆法&#xff1f; 基础知识&#xff1a; 国际象棋里&#xff0c;棋盘为8X8格。 皇后每步可以沿直线、斜线 走任意格。 思路&#xff1a; 1.想把8个皇后放进去&…

算法设计(一) : 搜索算法实现八皇后问题

写在开头&#xff1a;实验结果截图8皇后太多截不完&#xff0c;用4皇后代替了&#xff0c;只需将n->8就行 目录 写在开头&#xff1a;实验结果截图8皇后太多截不完&#xff0c;用4皇后代替了&#xff0c;只需将n->8就行图解算法过程&#xff1a;算法一&#xff1a;DFS 按…

八皇后问题(递归回溯算法详解+C代码)

为了理解“递归回溯”的思想&#xff0c;我们不妨先将4位皇后打入冷宫&#xff0c;留下剩下的4位安排进4x4的格子中且不能互相打架&#xff0c;有多少种安排方法呢&#xff1f;现在我们把第一个皇后放在第一个格子&#xff0c;被涂黑的地方是不能放皇后的&#xff1a; 第二行的…

算法设计与分析——八皇后问题的实现——代码分析和讲解

文章目录 题目描述思路分析回顾回溯法的基本框架解题框架应用到本题定义问题的解空间定义约束函数模仿回溯法的框架去解决问题 实现源码分析与总结 题目描述 在88格的棋盘上放置彼此不受攻击的8个皇后。国际象棋的规则&#xff1a;皇后可以攻击与之处在同一行或同一列或同一斜…

八皇后问题算法(C语言实现)

1. 八皇后的由来和问题 八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于1848年提出&#xff1a;在88格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个皇后都不能处于同一…

八皇后算法解析

今天研究力扣的一道题死活写不出来对应的算法&#xff0c;没办法自己算法基础太差。于是看了下答案&#xff0c;发现使用什么回溯算法&#xff0c;菜鸟表示平时开发期间写的最复杂的程序就是写了两层for循环&#xff0c;已经很牛逼了有木有&#xff1f;这个回溯算法什么鬼&…

递归算法之八皇后问题

八皇后问题&#xff08;英文&#xff1a;Eight queens&#xff09;&#xff0c;是由国际象棋棋手马克斯贝瑟尔于1848年提出的问题&#xff0c;是回溯算法的典型案例。 问题表述为&#xff1a;在88格的国际象棋上摆放8个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个…

八皇后问题4种c语言算法

八皇后问题 1.递归回溯法 B站懒猫老师讲的&#xff08;我在这里学的&#xff09; 八皇后问题的递归回溯算法思路&#xff1a;从第一行开始当某一行皇后位置不与前面所有皇后位置冲突那么记录该行皇后位置并调用递归函数进入下一行&#xff0c;摆放下一个皇后&#xff0c;逐个…

数据结构与算法 — 八皇后问题(回溯算法)

问题描述 在88格的国际象棋上摆放8个皇后&#xff0c;使其不能互相攻击&#xff0c;即任意两个皇后都不能处于同一行、同一列或同一斜线上&#xff0c;问有多少种摆法。 假设上图中红点为一个皇后的位置&#xff0c;那么他的同行&#xff0c;列&#xff0c;斜线上都不能再放置…

数据结构与算法-- 八皇后问题(多种实现方案)

八皇后问题解法一(排列筛选法) 本篇我们承接上一篇中的思想&#xff0c;想到了一个经典的算法题&#xff0c;八皇后问题&#xff1a;题目&#xff1a;在8*8的国际象棋上摆放8个皇后&#xff0c;使得其互相不能攻击&#xff0c;即任意两个换后不能在同一行&#xff0c;同一列&a…

C语言开方问题求助

求助&#xff1a; 使用的是Devcpp进行的编程尝试 在写程序的时候遇到了个问题&#xff0c;运行后结果显示为1#j 后来在朋友的帮助下改正了程序&#xff0c;解决了错误。之后的话&#xff0c;我按照我朋友的改正过的程序自己再重新打了一遍&#xff0c;结果运行后的结果还是显示…

C语言笔记

目录 基础... 3 基本类型数据... 5 定义变量... 6 进制... 6 ASCII&#xff08;阿斯克码&#xff09;... 7 输入输出... 8 printf&#xff08;&#xff09;将变量的内容输出到显示器上... 8 scanf &#xff08;&#xff09;[通过键盘将数据输入到变量中] 9 运算符... …

c语言 大数开方,大数加法之C语言函数法(只有正数版)

由于某些原因&#xff0c;我于今天2017-4-19将我的博文搬到博客园了&#xff0c;以后我就在这里扎根了。 之前想过在博客写文章方便日后复习&#xff0c;但一直未能实现&#xff0c;所以&#xff0c;现在这篇是我个人人生中第一篇博客&#xff0c;所以写博客完全没经验&#xf…

开平方的快速算法(C代码)

目录&#xff1a; 一、牛顿迭代法 二、采用移位、加减法、判断和循环实现开平方 三、效率远高于牛顿迭代法开平方法 1、原理 2、实现代码 四、卡马克快速开平方算法(推荐) 1、C-Free模拟验证卡马克开平方 2、移植到实际的项目 3、卡马克快速开平方的由来 1&#xff0…

windows 区域截屏以及延迟截屏

提起在Windows&#xff0c; 我们都会用到截屏功能&#xff0c;今天论述一下window 10系统自带的截图应用Snipping Tool 打开Snipping Tool 找到任务栏下的放大镜图标&#xff0c;点击 在下方输入snipping&#xff0c;会在左侧找到截图软件Snipping Tool&#xff0c;点击可进入…