以前写的一个八皇后问题求解,思路就是每次循环列出所有的可能解,然后过滤出不符合要求的解。详细见代码:

//检查两个点是否在攻击线上

def attack(p1,p2):

return p1[0]==p2[0] or p1[1] == p2[1] or (abs(p1[0]-p2[0])==abs(p1[1]-p2[1]))

//棋盘类

class Cell():

def __init__(self,n):

self.n = n

self.cell = [[(i,j) for j in range(n)] for i in range(n)]

def isAttack(p,rp):

for i in rp:

if attack(p,i):

return True

return False

def eightQueen(num):

cell = Cell(num)

board = cell.cell

result = [[(0,i)] for i in range(num)]

count = 0

for col in board:

count+=1

for p in col:

if not result:

result.append([p])

else:

#scan the result

for rp in result:

if not isAttack(p,rp):

copy = rp[:]

copy.append(p)

result.append(copy)

result = filter(lambda x: x.__len__()==count,result)

return filter(lambda x : x.__len__()==num,result)

//使用方式如下,返回所有的有效解

result = eightQueen(8)

下面是同事的递归方式的解决方案

class EightQueen:

#define const queen number

queenNum = 8

def __init__(self):

#定义一个8行 8 列的二维数组来模拟棋盘

self.qiPan = []

self.num = 0

#init a n*n list[][] as qi pan

for i in range(self.queenNum):

rows = []

for j in range(self.queenNum):

xy = [i,j]

rows.append(xy)

self.qiPan.append(rows)

#定义一个递归方法,递归去下一行寻找符合条件的坐标点

#param e8 存放符合条件的坐标点的列表

#param rowNum 寻找的行号

def getNext(self,e8,rowNum):

if len(e8) == self.queenNum:

self.num += 1

#输出符合条件的全部坐标点

print "method "+str(self.num)+"is:"+str(e8)

return

if rowNum > len(self.qiPan):

return

for d in self.qiPan[rowNum]:

if self.matchAllE8(e8,d):

e8copy = e8[:]

e8copy.append(d)

self.getNext(e8copy,rowNum+1)

def calcNum(self):

#遍历棋盘的第一行

for i in self.qiPan[0]:

#从第二行开始递归寻找符合条件的坐标

self.getNext([i],1)

print "all method is:"+str(self.num)

#判断left0坐标 是否满足上面行中已找到的全部符合条件的坐标都不攻击

def matchAllE8(self,e8,left0):

for i in e8:

if not self.isMatch(i,left0):

return False

return True

# 符合不攻击的条件

def isMatch(self,f,g):

return (f[0]+f[1] != g[0]+g[1]) and\

(f[0]-f[1] != g[0]-g[1]) and\

(f[0] != g[0]) and (f[1] != g[1])

e = EightQueen()

e.calcNum()

八皇后问题python实现_八皇后问题的python实现相关推荐

  1. 如何零基础学习python语言_零基础如何学习Python编程

    Python是一门简单优雅的计算机程序设计语言,相比于C语言.Java语言,Python编程具有以下特点: 1. Python语法简单,代码可读性高,容易入门: 2. Python代码具有一定的规范性 ...

  2. 零基础学python 视频_零基础入门学习PYTHON(第2版)(微课视频版)

    小甲鱼畅销图书重磅升级,针对Python 3.7,通过生动的实例,让读者在实践中理解概念,在轻松.愉快中学会Python! 本书提倡理解为主,应用为王.因此,只要有可能,小甲鱼(注:作者)都会通过生动 ...

  3. windows10安装python环境_在windows10下安装python(配置环境变量),Windows10

    建议使用:anaconda(环境管理和包管理)+Pycharm (强大的IDE开发工具) python环境变量设置: window系统高级设置-> 系统环境变量里 变量名: PYTHONPATH ...

  4. 怎么查看自己安装的python版本_教你如何检查 Python 版本

    本教程介绍如何使用 命令行检查操作系统上安装的 Python 版本.这在安装用 Python 编写的需要特定版本 Python 的应用程序时非常有用. Python 是世界上最流行的编程语言之一.它用 ...

  5. geany搭建python环境_第一章:搭建Python的开发环境

    第一步: 我们在Python的官网上下载Python的安装包,此安装包内含有Python解释器.Python运行的基础库,以及交互式运行工具--Python Shell 第二步: 安装时弹出下面对话框 ...

  6. 头条上python广告_满大街都是Python广告,真的如广告说的那样方便吗?,学精通后真能月如过万吗?业内大佬怎么看?...

    在编程领域.Python语言已经被吹得神乎其神.很多人已经产生了一种错觉:仿佛当今编程世界,唯Python莫属,其它语言皆为渣渣. 就连地产大佬潘石屹也发微博为Python背书,不愧两者都姓" ...

  7. python练习_如何使用Logzero在Python中练习记录

    python练习 Logzero is a Python package created by Chris Hager that simplifies logging with Python 2 an ...

  8. python+[:]+切片_我从C ++到Python的方式:概念上的改变

    python+[:]+切片 by asya f 由asya f 我从C ++到Python的方式:概念上的改变 (How I went from C++ to Python: a conceptual ...

  9. sublime运行python代码_怎么用sublime运行python

    首先需要安装一个Sublime Text(http://www.sublimetext.com/)和一个Python(https://www.python.org/downloads/) 接下来打开S ...

  10. pycharm python部署_使用PyCharm配合部署Python的Django框架的配置纪实

    安装软件安装 Python 2.7.PyCharm.pip(Python包管理工具).Django ( pip install Django) 部署PyCharm 新建Django工程 完成后,其目录 ...

最新文章

  1. Xamarin图表开发基础教程(3)OxyPlot框架
  2. 怎样学好C语言,一个成功人士的心得!
  3. .NET 5开源项目:b站账号快速升级到 Lv6,每天自动签到,观看,分享,投币视频!...
  4. SAP License:定义在制品和结果分析过账OKG8
  5. Atitit 理财之道 attilax著 1. 融资 3 1.1. 融资账户余渠道 3 2. 风控 3 3. 3 4. 投资 3 5. 线上财富与资源 3 5.1. Jd流量 飞猪流量 3 5.
  6. java泛型为伪泛型,什么,JAVA的泛型是伪泛型
  7. 操作系统——概念、功能、特征及发展分类
  8. 信息系统项目管理师进度管理论文范例
  9. STA之RC Corner
  10. 板线分离嵌入式RFID读卡模块NFC读写模块HX880系列的应用案例
  11. Canary学习(泄露Canary)
  12. 同花顺抓起涨做波段指标公式 副图 源码
  13. 刷脸支付:一场输不起的战役
  14. android 微信摇一摇功能实现,android 类似微信的摇一摇功能实现思路及代码
  15. 【python-02】
  16. 定义一个学生类Student,包含三个属性姓名、年龄、性别, 创建三个学生对象存入ArrayList集合中。 A:使用迭代器遍历集合。 B:求出年龄最大的学生,然后将该对象的姓名变为:小猪佩奇。
  17. ②号团队【扫黑除恶Team】-团队任务5:项目总结会
  18. CSS阿里矢量图标(字体图标)
  19. 使用X-NUCLEO-GFX01M1 开发板快速进行 GUI 开发
  20. php开发手册要看完吗,9个开发人员应该知道的PHP库

热门文章

  1. linux下的僵尸进程处理SIGCHLD信号【转】
  2. ehcache memcache redis 三大缓存
  3. cogs 896. 圈奶牛
  4. 新浪微博-企业微博运营手册
  5. 初级PHP开发作品容易出现的几个不足
  6. 专家:四大问答指出混合云的应用之路
  7. 通讯实例 modbus_实例讲解PLC实现modbus通讯
  8. Windows 中进程的相关操作
  9. 一篇文章教你弄懂 SpringMvc中的HandlerInterceptor
  10. postgresql介绍,安装,启动