python学习八皇后问题

 1 import random
 2 #冲突检查,在定义state时,采用state来标志每个皇后的位置,其中索引用来表示横坐标,基对应的值表示纵坐标,例如: state[0]=3,表示该皇后位于第1行的第4列上
 3 def conflict(state, nextX):
 4     nextY = len(state)
 5     for i in range(nextY):
 6         #如果下一个皇后的位置与当前的皇后位置相邻(包括上下,左右)或在同一对角线上,则说明有冲突,需要重新摆放
 7         if abs(state[i]-nextX) in (0, nextY-i):
 8             return True
 9     return False
10
11 #采用生成器的方式来产生每一个皇后的位置,并用递归来实现下一个皇后的位置。
12 def queens(num, state=()):
13     for pos in range(num):
14         if not conflict(state, pos):
15             #产生当前皇后的位置信息
16             if len(state) == num-1:
17                 yield (pos, )
18             #否则,把当前皇后的位置信息,添加到状态列表里,并传递给下一皇后。
19             else:
20                 for result in queens(num, state+(pos,)):
21                     yield (pos, ) + result
22
23
24 #为了直观表现棋盘,用X表示每个皇后的位置
25 def prettyprint(solution):
26     def line(pos, length=len(solution)):
27         return ‘. ‘ * (pos) + ‘X ‘ + ‘. ‘*(length-pos-1)
28     for pos in solution:
29         print line(pos)
30
31 if __name__ == "__main__":
32     prettyprint(random.choice(list(queens(8))))
时间: 2024-08-25 16:38:47

python学习八皇后问题的相关文章

C语言学习--八皇后问题

问题描述: 在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 程序设计: 1.一维数组a[17],数组分成三段,第一段a[0]用来标记八皇后安置完成:第二段a[1,8]用来标记列位置有无子,方便判断列冲突:第三段a[9,16]用来标记存储位置. 2.关键算法 递归判断位置,eightQueens . 3.对角线位置互斥判断, isDiagonal. 4.输出函数, printResult. 算法描述: 1.首次传入为数组a

python解决八皇后问题

经典回溯算法:八皇后问题 算法要求: 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上. 国际象棋的棋盘如下图所示: 问共有多少种不同的方法,并且指出各种不同的放法. # -*- coding:utf-8 -*- __author__ = "tyomcat" print("******八皇后问题的解决方法******") def next_col(current, n=8): length = len(curr

python学习八十四天:爬虫基础

爬虫基础 爬虫相关概念简介 什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程. 哪些语言可以实现爬虫 1.php:可以实现爬虫.php被号称是全世界最优美的语言(当然是其自己号称的,就是王婆卖瓜的意思),但是php在实现爬虫中支持多线程和多进程方面做的不好. 2.java:可以实现爬虫.java可以非常好的处理和实现爬虫,是唯一可以与python并驾齐驱且是python的头号劲敌.但是java实现爬虫代码较为臃肿,重构成本较大. 3.c.c++:可以实现爬虫.但是

Python学习(八) 输出任意格式的字符串以及字符串的切片

在Python中想要输出一句话,如下 1 a='hello world' 2 print a 3 //打印出的是hello world 4 5 print 'hello \n world' 6 //打印出的是 7 //hello 8 //world 9 print '''hello 10 world 11 good 12 bye''' 13 //打印出的是 14 //hello 15 //world 16 //good 17 //bye 如果想要输出换行的字符串,可以再字符串中添加转义字符 '\

Python学习二(生成器和八皇后算法)

看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 def table(m, lst): '''绘制m列的棋盘,每行有个皇后旗子''' head = '┌' + '─┬' * (m-1) + '─┐' row = lambda x: '│' + ' │' * x + '╳│' + ' │' * (m - x - 1) trow = '├' + '─

Python学习系列(八)( 面向对象基础)

 Python学习系列(八)( 面向对象基础) Python学习系列(七)( 数据库编程) 一,面向对象 1,域:属于一个对象或类的变量.有两种类型,即实例变量—属于每个实例/类的对象:类变量—属于类本身. 2,类的方法:对象也可以使用属于类的函数来具有功能,这样的函数称之为类的方法.域和方法合称为类的属性.类使用class关键字创建,类的属性被列在一个缩进块中. 3,self:类的方法与普通的函数只有一个特别的区别----他们必须有一个额外的第一个参数名称,但是在调用的时候不能为其赋值,Pyt

八皇后问题python实现

八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上.八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n.当且仅当 n = 1 或 n ≥ 4 时问题有解. 具体可以参考:https://github.com/chenqiangzhishen/Python/blob/master/pythonAlgorithms/eig

python学习笔记八——正则表达式

1.元字符 []-常用来指定一个字符集:[abc];[a-z] -元字符在字符集中不起作用:[akm$] -补集匹配不在区间范围内的字符:[^5] ^-匹配行首 $-匹配行尾 \-后可加不同字符以表示不同意义,也可用于取消所有元字符 \d 匹配任何十进制数,相当于[0-9] \D 匹配任何非数字字符,相当于[^0-9] \s 匹配任何空白字符,相当于[\t\n\r\f\v] \S 匹配任何非空白字符 \w 匹配任何字母数字字符 \W 匹配任何非字母数字字符 *-匹配前一个字符零次或多次 +-至少

八皇后问题的Python实现和C#实现

看到八皇后问题的解决思路, 感觉很喜欢. 我用C#实现的版本之前贴在了百度百科上(https://baike.baidu.com/item/%E5%85%AB%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98#2_7).百度百科已经有Python版本, 且效率比我的高一点儿, 所以决定把我的版本在博客园贴出来.相信我的版本更容易理解. 希望能够对大家有所帮助.上代码: Python: # EightQueens.py def checkConflict(queenList,