算法思考-以八皇后问题为例 python

本文探讨了算法学习的原则,包括问题抽象、算法选择和实现。以八皇后问题为例,介绍了解决问题的六步法:理解问题、描述规则、结束条件、手动计算、程序实现和优化。通过递归回溯的思路,给出了Python实现八皇后问题的解决方案,减少无效的计算次数。
摘要由CSDN通过智能技术生成

算法学习原则

第一:问题抽象成可能的算法方案
知道的算法越多,对基础的算法理解越好,就越能将问题合理的抽象成具体算法
第二:算法方案的选择

  • 效率,稳定性,甚至工作量都是常常需要考虑的原因
  • 有时候,也需要做一些实验。需要有很强的编程能力
  • 对算法的理解越深刻,可以节省实验式错的时间
    第三:实现这个方案
  • 方法尽可能复用,有很强的的扩展性
  • 方便统一管理与更新

碰到一个现实问题应该如何去做

step1:理解问题,写出输入与输出
step2:描述问题的处理规则与约束
step3:描述问题的结束条件与程序迭代方式
step4:以上程序做好之后,提供一个样例输入,进行简单手算 明白以上三条规则
step5:以上工作做好之后,先用程序实现规则,再做程序的嵌套
step6:进行优化

示例 八皇后问题
国际象棋中的皇后比中国象棋里的大车还厉害,皇后能横向,纵向和斜向移动,在这三条线上的其他棋子都可以被吃掉。所谓八皇后问题就是:将八位皇后放在一张8x8的棋盘上,使得每位皇后都无法吃掉别的皇后,(即任意两个皇后都不在同一条横线,竖线和斜线上),问一共有多少种摆法。此问题是在1848年由棋手马克思·贝瑟尔提出的,后面陆续有包括高斯等大数学家们给出自己的思考和解法,所以此问题不只是有年头了,简直比82年的拉菲还有年头,我们今天不妨尝尝这老酒。
我们先举例来理解一下这个问题的场景到底是什么样子的,下面的绿色格子是一个皇后在棋盘上的“封锁范围”,其他的皇后不能放置在这些绿格子中:
我们先举例来理解一下这个问题的场景到底是什么样子的,下面的绿色格子是一个皇后在棋盘上的“封锁范围”,其他的皇后不能放置在这些绿格子中:
在这里插入图片描述
我们再放入一个皇后,看一下两个皇后的“封锁范围”(绿格子不能放):

在这里插入图片描述
如此继续下去,能安放下一位皇后的位置越来越少,那么我们最终如何能安放完这8位皇后呢?
首先我们看一下特别暴力的方法:从8x8的格子里选8个格子,放皇后,然后测试是否满足条件,若满足则结果加1,否则换8个格子继续试。很显然,64选8,并不是个小数字,十亿级别的次数,够暴力。如果换成围棋的棋盘,画面就会太美而不敢算。
稍加分析,我们可以得到另一个不那么暴力的方法:显然,每行每列最多只能有一位皇后,如果基于这个事实再进行暴力破解,那结果会好很多。安排皇后时,第一行有8种选法,一旦第一行选定,假设选为(1,i),那么第二行只能选(2,j),其中,j不等于i,所以有7种选法。以此类推,需要穷举的情况有8!=40320种,比十亿级别的小很多了。
这看起来已经不错了,但尝试的次数还是随着问题规模按阶乘水平提高的,我们仍然不满意,所以,“递归回溯”的思想就被提出了,专治这种问题。
所谓递归就是:针对程序后续迭代具有同样的逻辑而调用自身的情况
回溯:为了求得问题的解,先选择某一种可能的情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就退回一步重新选择,继续向前探索,如此反复进行,直至得到解或 证明无解

针对上述问题,大致有了清晰的认识,接下来我们按照上述6个步骤将这个程序写出来
step1:理解问题,写出输入与输出
input:输入N,这里为8,表示程序是在8*8的网格中进行运算
output:输出满足规则的皇后的摆放位置,如一种摆放位置为:

[7, 3, 0, 2, 5, 1, 6, 4] 代表行数 
[0, 1, 2, 3, 4, 5, 6, 7] 代表列
<-><-><Q><-><-><-><-><->	
<-><-><-><-><-><Q><-><->	
<-><->
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值