两种方法

第二种方法解释

第一层for表示第一个皇后的位置,然后第二层for表示,循环8次,表示其他皇后的位置,最后限制次数,是if判断

def conflict(state,nextx):

'定义冲突函数,state为元组,nextx为下一个皇后的水平位置,nexty为下一个皇后的垂直位置'

nexty = len(state)

for i in range(nexty):

if abs(state[i]-nextx) in (0,nexty-i):#若下一个皇后和前面的皇后列相同或者在一条对角线上,则冲突

return True

return False

def queens(num=8,state=()):

'八皇后问题,这里num表示规模'

for pos in range(num):

if not conflict(state,pos ):#位置不冲突

if len(state) == num - 1:#若是最后一个皇后,则返回该位置

yield (pos,)

else:#若不是最后一个皇后,则将该位置返回到state元组并传给后面的皇后

for result in queens(num,state + (pos,)):

yield (pos,) + result

l = 0

for i in queens(num=8,state=()):

print i

l += 1

print l

from itertools import permutations

for vec in permutations(range(8)):

if (8 == len(set(vec[i]+i for i in range(8)))== len(set(vec[i]-i for i in range(8)))):

print vec

global col #定义一些全局变量

global row

global pos_diag

global nag_diag

global count

def output():

''' 输出一种有效结果

'''

global count

print row

count += 1

def do_queen(i):

''' 生成所有正确解

@param i: 皇后的数目

'''

for j in range(0, 8): #依次尝试0~7位置

if col[j] == 1 and pos_diag[i-j+7] == 1 and nag_diag[i+j] == 1:

#若该行,正对角线,负对角线上都没有皇后,则放入i皇后

row[i] = j

col[j] = 0 #调整各个列表状态

pos_diag[i-j+7] = 0

nag_diag[i+j] = 0

if i < 7:

do_queen(i+1) #可递增或递减

else:

output() #产生一个结果,输出

col[j] = 1 #恢复各个列表状态为之前的

pos_diag[i-j+7] = 1

nag_diag[i+j] = 1

if __name__ == '__main__':

col = [] #矩阵列的列表,存储皇后所在列,若该列没有皇后,则相应置为1,反之则0

row = [] #矩阵行的列表,存放每行皇后所在的列位置,随着程序的执行,在不断的变化中,之间输出结果

pos_diag = [] #正对角线,i-j恒定,-7~0~7,并且b(i)+7统一到0~14

nag_diag = [] #负对角线,i+j恒定,0~14

count = 0

for index in range(0, 8): #一些初始化工作

col.append(1)

row.append(0)

for index in range(0, 15):

pos_diag.append(1)

nag_diag.append(1)

do_queen(0)

#开始递归,先放一个,依次递增,反过来,从7开始递减也可

print 'Totally have %d solutions!' % count

import random

#冲突检查,在定义state时,采用state来标志每个皇后的位置,其中索引用来表示横坐标,基对应的值表示纵坐标,例如: state[0]=3,表示该皇后位于第1行的第4列上

def conflict(state, nextX):

nextY = len(state)

for i in range(nextY):

#如果下一个皇后的位置与当前的皇后位置相邻(包括上下,左右)或在同一对角线上,则说明有冲突,需要重新摆放

if abs(state[i]-nextX) in (0, nextY-i):

return True

return False

#采用生成器的方式来产生每一个皇后的位置,并用递归来实现下一个皇后的位置。

def queens(num, state=()):

for pos in range(num):

if not conflict(state, pos):

#产生当前皇后的位置信息

if len(state) == num-1:

yield (pos, )

#否则,把当前皇后的位置信息,添加到状态列表里,并传递给下一皇后。

else:

for result in queens(num, state+(pos,)):

yield (pos, ) + result

#为了直观表现棋盘,用X表示每个皇后的位置

def prettyprint(solution):

def line(pos, length=len(solution)):

return '. ' * (pos) + 'X ' + '. '*(length-pos-1)

for pos in solution:

print line(pos)

if __name__ == "__main__":

prettyprint(random.choice(list(queens(8))))

def queens(num=8, state=()):

for pos in range(num):

if not conflict((), pos):

queens(num, state+(pos,)) #递归调用,将此行展开

def conflict(state,nextx):

'定义冲突函数,state为元组,nextx为下一个皇后的水平位置,nexty为下一个皇后的垂直位置'

nexty = len(state)

for i in range(nexty):

if abs(state[i]-nextx) in (0,nexty-i):#若下一个皇后和前面的皇后列相同或者在一条对角线上,则冲突

return True

return False

def queens(num=8,state=()):

'八皇后问题,这里num表示规模'

for pos in range(num):

if not conflict(state,pos):#位置不冲突

if len(state) == num - 1:#若是最后一个皇后,则返回该位置

yield (pos,)

else:#若不是最后一个皇后,则将该位置返回到state元组并传给后面的皇后

for result in queens(num,state + (pos,)):

yield (pos,) + result

def prettyp(solution):

'打印函数'

def line(pos,length = len(solution)):

'打印一行,皇后位置用X填充,其余用0填充'

return 'O'*(pos)+'X'+'O'*(length-pos-1)

for pos in solution:

print(line(pos))

import random

#随机打印一种

prettyp(random.choice(list(queens(8))))

# -*- coding: utf-8 -*-

#python默认为ascii编码,中文编码可以用utf-8

import random

#随机模块

def conflict(state,col):

#冲突函数,row为行,col为列

row=len(state)

for i in range(row):

if abs(state[i]-col) in (0,row-i):#重要语句

return True

return False

def queens(num=8,state=()):

#生成器函数

for pos in range(num):

if not conflict(state, pos):

if len(state)==num-1:

yield(pos,)

else:

for result in queens(num, state+(pos,)):

yield (pos,)+result

def queenprint(solution):

#打印函数

def line(pos,length=len(solution)):

return '. '*(pos)+'X '+'. '*(length-pos-1)

for pos in solution:

print line(pos)

for solution in list(queens(8)):

print solution

print ' total number is '+str(len(list(queens())))

print ' one of the range is:\n'

queenprint(random.choice(list(queens())))

八皇后问题python_python八皇后问题相关推荐

  1. 八皇后问题python_python八皇后问题的解决方法

    本文为大家分享了python八皇后问题的解决方法,供大家参考,具体内容如下 题目: 给定一个 N*N 正方形棋盘,在上面放置 N个棋子,又叫皇后,使每两个棋子都不在同一条横线上.竖线上.斜线上.一般我 ...

  2. 八皇后算法python_Python学习二(生成器和八皇后算法)

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  3. 八皇后问题python_python求解八皇后问题

    今天突然有个行外的朋友扔了一张图给我,希望我能帮他用python做一下这个作业--八皇后问题. 八皇后问题是一种经典的数学求解问题,规则是在8×8的国际象棋棋盘上,要求在每一行(或者每一列)放置一个皇 ...

  4. 八皇后问题和八数码问题的最陡上升爬山法、首选爬山法、随机重启爬山法、模拟退火算法的分析和实现

    对经典算法的问题的回顾与感想 对八皇后问题和八数码问题分别用最陡上升爬山法.首选爬山法.随机重启爬山法.模拟退火算法来实现,并且分析他们的性能. 分析 要求实现的各个算法是有共同点的,比如,八皇后问题 ...

  5. 【恋上数据结构】回溯、剪枝(八皇后、n皇后)、LeetCode51.N皇后、LeetCode52.N皇后 II

    回溯 回溯(Back Tracking) 提出八皇后问题(Eight Queens) 初步思路一:暴力出奇迹 初步思路二:根据题意减少暴力程度 初步思路三:回溯法(回溯+剪枝) 四皇后 - 回溯法图示 ...

  6. 爬山法、随机重启爬山法、模拟退火算法对八皇后问题和八数码问题的性能测试...

    代码地址:https://github.com/laiy/AI/tree/master/awesome-search 一些前提: 1. 首先要明确这些算法并不是用于解决传统的搜索问题的(环境是可观察的 ...

  7. java 八皇后问题以及N皇后问题

    想了解更多数据结构以及算法题,可以关注微信公众号"数据结构和算法",每天一题为你精彩解答.也可以扫描下面的二维码关注 八皇后的来源 八皇后问题是一个以国际象棋为背景的问题:如何能够 ...

  8. 八皇后加强版:每个皇后最多攻击一个其它的皇后

    想必搞OI/ACM的朋友都应该知道八皇后问题,这是学习编程的必修课程之一:在国际象棋棋盘上最多可以放置多少个互不攻击的皇后(皇后可以攻击它所在的行.列.对角线方向上的棋子)?显然,能够放置的皇后数不超 ...

  9. 2021-01-11经典的八皇后问题和N皇后问题, 回溯

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

最新文章

  1. mysql char 和varchar哪种效率高_MySQL数据库中的字段类型varchar和char的主要区别是什么?那种字段的查找效率要高,为什么?...
  2. saltstack (6) 配置管理(2)
  3. php5.6 交叉编译,Cross-compile - 龙芯开源社区
  4. wildfly管理控制台_WildFly 9 –别希望您的控制台像这样!
  5. 成员变量、局部变量、实例变量、静态变量、类变量、常量
  6. c ++产生不同的随机数_C ++程序生成随机密码
  7. 1.9 编程基础之顺序查找 01 查找特定的值
  8. 一个正在被API驱动的互联网时代
  9. 科创板开市暴涨,详解25家企业的“造富”能力
  10. 解决办法:nvidia-settings:ERROR: Unable to load info from any available system
  11. iPhone开发--在iPad上调用UIAlertController函数时发生crash
  12. Python爬虫实战之爬取链家广州房价_02把小爬虫变大
  13. 区块链技术实体结合解决方案——汇新云
  14. 英伟达账号为什么登录不了_n卡的geforce experience登录不了怎么办?
  15. Adobe Premiere Pro CC教程笔记
  16. #从零开始学HCIA起步
  17. android 屏幕的放大缩小实现
  18. coreldraw x4离线激活_coreldraw x4怎么激活 coreldraw x4注册机使用方法
  19. 如何删除多个计算机名称,电脑双系统怎么删除一个呢?教你快速删除
  20. 微信小程序怎么免费做

热门文章

  1. 哈夫曼树的带权路径长度的算法
  2. 想知道月球上的美国国旗怎么样了吗?答案在此
  3. 芯片|紫光国微拟对参股子公司紫光同创增资 后者从事商用FPGA相关业务
  4. 关于python函数参数的描述中、错误的是_以下关于函数参数的描述,正确的是
  5. 国有建设用地使用权挂牌出让须知
  6. elementui表单插槽
  7. Linux系统中进入退出vim编辑器
  8. python sum函数时间复杂度_Python之时间复杂度
  9. Axure 的第一个作品——线框图
  10. C++初阶习题(牛客网)【5】求字符串最后一个单词的长度