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

参考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++的代码也要看得懂,毕竟很多经典算法都是用这些编写的,算法核心思想都是一样的,参加比赛选一个自己喜欢的编程语言就好。

递归算法——八皇后问题 python相关推荐

  1. 八皇后问题python实现

    八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.八皇后 ...

  2. 八皇后问题python实现_八皇后问题的python实现

    以前写的一个八皇后问题求解,思路就是每次循环列出所有的可能解,然后过滤出不符合要求的解.详细见代码: //检查两个点是否在攻击线上 def attack(p1,p2): return p1[0]==p ...

  3. 回溯递归算法----八皇后问题

    前,有皇帝.就拿八皇后.由此产生的一系列问题,凌乱.由此产生的八皇后问题.哈哈 开玩笑~~~~ 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848 ...

  4. 八皇后问题python_八皇后问题Python实现

    八皇后问题描述 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...

  5. 八皇后问题python回溯_解决Python基于回溯法子集树模板实现8皇后问题

    这篇文章主要介绍了Python基于回溯法子集树模板实现8皇后问题,简单说明了8皇后问题的原理并结合实例形式分析了Python回溯法子集树模板解决8皇后问题的具体实现技巧,需要的朋友可以参考下 本文实例 ...

  6. LeetCode —— 面试题 08.12. 八皇后(Python)

    设计一种算法,打印 N 皇后在 N × N 棋盘上的各种摆法,其中每个皇后都不同行.不同列,也不在对角线上.这里的"对角线"指的是所有的对角线,不只是平分整个棋盘的那两条对角线. ...

  7. C语言编程统计八皇后问题的解的个数,八皇后问题C语言解法

    偶遇八皇后问题,随即自己写了一个仅供参考 #include #include #define SIZE 8 void Circumsribe(int(*checkerboard)[SIZE], int ...

  8. 八皇后算法分析及源代码

    [问题描述]  八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九 世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使 其不能互相攻击,即任意两个皇后都不能处 ...

  9. 关于python的八皇后问题递归算法详解

    这里是对于周一课上的老师教学的python八皇后问题的个人学习记录 八皇后问题出自国际象棋:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不 ...

最新文章

  1. 越小越好:为什么电子器件都这么小巧玲珑?
  2. VMware大会宋家瑜言虚拟化2015年方至巅峰
  3. html border阴影效果_【开发小技巧】—如何使用HTML和CSS创建浮动框效果?
  4. error2---BeginPath和EndPath之间的TextOut无法显示
  5. jMeter parallel controller 无法使用 CSV Data config 提供的变量?
  6. 学习笔记7-C语言-进制转换、原返补、位运算、函数
  7. 蚂蚁链发布新一代网络平台「FAIR」 区块链进入隐私计算原生时代
  8. Create view failed with ORA-01031:insufficient privileges
  9. HM使用之2 Working Directory的解释
  10. 菜鸟的学习之路(13) —TreeSet类的排序
  11. EF-CodeFirst-3搞事
  12. EJB JBOSS的安装
  13. Gprinter Android SDK V2.1 使用说明
  14. PG数据库表及表注释查询语句
  15. 韦根协议c语言,基于STM8系列的韦根协议门禁源代码 1.STM8系列开发源代码; 2.已做门禁开发:韦根协议刷卡门禁控制源代码; - 下载 - 搜珍网...
  16. 什么是功率因数补偿/校正
  17. Redis Cluster集群(Linux设计搭建)
  18. Springboot Swagger2 Unable to infer base url问题解决
  19. dwc3_gadget_init分析
  20. 快卫士是如何帮您保驾护航

热门文章

  1. 微软轻量级监控工具sysmon原理与实现
  2. 怎样做需求分析:业务流程分析
  3. 使用cnpm安装 React
  4. 推荐系统中精排模型的多目标优化
  5. 湛江市电子口岸集成项目灾备
  6. 联想网盘、钉钉、销售易:企业减负增效的SaaS解决方案
  7. 世纪末的星期**曾有邪教称1999年12月31日是世界末日。当然该谣言已经不攻自破。还有人称今后的某个世纪末的12月31日,如果是星期一则会....有趣的是,任何一个世纪末的年份的12月3
  8. Flappy Bird总结
  9. 为什么网络棋牌的分成那么高?
  10. 编译安装PHP,解决问题 Don't know how to define struct flock on this system, set --enable-opcache=no