当前位置:首页 » 编程语言 » python8皇后

python8皇后

发布时间: 2023-01-05 02:50:48

python中if __name__ == "__main__":的求问,这句话是true吗,为什么,代码如图,是八皇后问题代码

__name__ == "__main__"
__name__ 是模块的一个属性,如果模块是被执行的话, 那么值为__main__,如果被导入的话那么就是模块名

❷ Python用迭代(yield)和递归解决八皇后问题


国际象棋的皇后行走具有最高的灵活性,可以横、竖、斜共八个方向无限步行走。你需要将国际象棋8个皇后放在棋盘上,条件是任何一个皇后都不能威胁其他皇后,即任何两个皇后都不能吃掉对方。

分析:在棋盘的第一行尝试为第一个皇后选择一个位置,再在第二行尝试为第二个皇后选择一个位置,依次类推。在发现无法为一个皇后选择合适的位置后,回溯到前一个皇后,并尝试为它选择另一个位置。当八个皇后都放在棋盘上时即得到一种解。


用元组(其他序列也可以)表示可能的解(或一部分),例如(1,3,5)表示当前共摆放了三个皇后,第一个皇后在1行1列,第二个皇后在2行3列,第三个皇后在3行5列。



当前状态state,下一个皇后在下一行的next_x位置,根据皇后的行走规则,如果已有的皇后可以吃掉下一个皇后,则表示有冲突,否则没有。

函数conflict定义:接受用状态元组表示的既有皇后的位置,并确定下一个皇后的位置是否会导致冲突。


参数 next_x 表示下一个皇后的水平位置(x 坐标,即列),而 next_y 为下一个皇后的垂直位置(y 坐标,即行)。这个函数对既有的每个皇后执行简单的检查:如果下一个皇后与当前皇后的 x 坐标相同或在同一条对角线上,将发生冲突,因此返回True ;如果没有发生冲突,就返回False 。

abs(state[i] - next_x) in (0, next_y - i) 表示两个皇后的水平距离为0或等于垂直距离时为真、否则为假。




❸ python八皇后问题是怎么递归的求解

凡是线性回溯都可以归结为右递归的形式,也即是二叉树,因此对于只要求一个解的问题,采用右递归实现的程序要比回溯法要优美的多。

[py] view plain
def Test(queen,n):
'''''这个就不用说了吧,就是检验第n(下标,0-7)行皇后的位置是否合理'''
q=queen

for i in xrange(n):
if queen[i]==q or queen[i]-q==n-i or queen[i]-q==i-n:return False
return True
def Settle(queen,n):
'''''这个负责安置第n(下标,0-7)行皇后,每次调用,皇后都至少会移动一步'''
queen
+=1
while queen
<8 and not Test(queen,n):queen
+=1
return queen
<8
def Solve(queen,n):
'''''这个负责解决第n(下标,0-7)行皇后的安置以及随后所有皇后的安置'''
if n==8:#安置完所有皇后了,故输出列表
print queen
return True#如果设为假,则会尝试所有的安置方案
else:
queen
=-1#初始化第n行皇后的起始位置(起始位置-1,可安置在0-7)
while Settle(queen,n):#如果成功安置皇后
if Solve(queen,n+1):#安置其余皇后
return True#成功安置,返回真
return False#失败,返回假
if __name__=='__main__':
Solve([-1 for i in range(8)],0)#列表的值可以随便设置,因为会初始化
#虽然我们没有进行回溯,但事实上,我们每一个参数相同的Solve函数都尝试了多次
#输出:[0, 4, 7, 5, 2, 6, 1, 3]
#比回溯法容易多了吧

❹ 八皇后 用Python写的源码 谢谢

import random
'''
设两个不同的皇后分别在j,k行上,x[j],x[k]分别表示在j,k行的那一列上。
那么不在同一对角线的条件可以写为abs((j-k))!=abs(x[j]-x[k])
'''
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

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))))

❺ python段错误,

http://blog.csdn.net/liangzhao_jay/article/details/47955079

❻ python关于八皇后判断冲突函数的一些逻辑小问题

代码确实不对false的返回位置不对,另外你的问题答案是在一条对角线说明两点连接的斜率为1或负1,也就是横坐标相减的绝对值等于纵坐标相减

❼ python解决八皇后算法

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

输出:
[0, 4, 7, 5, 2, 6, 1, 3]
[0, 5, 7, 2, 6, 3, 1, 4]
[0, 6, 3, 5, 7, 1, 4, 2]
[0, 6, 4, 7, 1, 3, 5, 2]
[1, 3, 5, 7, 2, 0, 6, 4]
[1, 4, 6, 0, 2, 7, 5, 3]
[1, 4, 6, 3, 0, 7, 5, 2]
[1, 5, 0, 6, 3, 7, 2, 4]
[1, 5, 7, 2, 0, 3, 6, 4]
[1, 6, 2, 5, 7, 4, 0, 3]
[1, 6, 4, 7, 0, 3, 5, 2]
[1, 7, 5, 0, 2, 4, 6, 3]
[2, 0, 6, 4, 7, 1, 3, 5]
[2, 4, 1, 7, 0, 6, 3, 5]
[2, 4, 1, 7, 5, 3, 6, 0]
[2, 4, 6, 0, 3, 1, 7, 5]
[2, 4, 7, 3, 0, 6, 1, 5]
[2, 5, 1, 4, 7, 0, 6, 3]
[2, 5, 1, 6, 0, 3, 7, 4]
[2, 5, 1, 6, 4, 0, 7, 3]
[2, 5, 3, 0, 7, 4, 6, 1]
[2, 5, 3, 1, 7, 4, 6, 0]
[2, 5, 7, 0, 3, 6, 4, 1]
[2, 5, 7, 0, 4, 6, 1, 3]
[2, 5, 7, 1, 3, 0, 6, 4]
[2, 6, 1, 7, 4, 0, 3, 5]
[2, 6, 1, 7, 5, 3, 0, 4]
[2, 7, 3, 6, 0, 5, 1, 4]
[3, 0, 4, 7, 1, 6, 2, 5]
[3, 0, 4, 7, 5, 2, 6, 1]
[3, 1, 4, 7, 5, 0, 2, 6]
[3, 1, 6, 2, 5, 7, 0, 4]
[3, 1, 6, 2, 5, 7, 4, 0]
[3, 1, 6, 4, 0, 7, 5, 2]
[3, 1, 7, 4, 6, 0, 2, 5]
[3, 1, 7, 5, 0, 2, 4, 6]
[3, 5, 0, 4, 1, 7, 2, 6]
[3, 5, 7, 1, 6, 0, 2, 4]
[3, 5, 7, 2, 0, 6, 4, 1]
[3, 6, 0, 7, 4, 1, 5, 2]
[3, 6, 2, 7, 1, 4, 0, 5]
[3, 6, 4, 1, 5, 0, 2, 7]
[3, 6, 4, 2, 0, 5, 7, 1]
[3, 7, 0, 2, 5, 1, 6, 4]
[3, 7, 0, 4, 6, 1, 5, 2]
[3, 7, 4, 2, 0, 6, 1, 5]
[4, 0, 3, 5, 7, 1, 6, 2]
[4, 0, 7, 3, 1, 6, 2, 5]
[4, 0, 7, 5, 2, 6, 1, 3]
[4, 1, 3, 5, 7, 2, 0, 6]
[4, 1, 3, 6, 2, 7, 5, 0]
[4, 1, 5, 0, 6, 3, 7, 2]
[4, 1, 7, 0, 3, 6, 2, 5]
[4, 2, 0, 5, 7, 1, 3, 6]
[4, 2, 0, 6, 1, 7, 5, 3]
[4, 2, 7, 3, 6, 0, 5, 1]
[4, 6, 0, 2, 7, 5, 3, 1]
[4, 6, 0, 3, 1, 7, 5, 2]
[4, 6, 1, 3, 7, 0, 2, 5]
[4, 6, 1, 5, 2, 0, 3, 7]
[4, 6, 1, 5, 2, 0, 7, 3]
[4, 6, 3, 0, 2, 7, 5, 1]
[4, 7, 3, 0, 2, 5, 1, 6]
[4, 7, 3, 0, 6, 1, 5, 2]
[5, 0, 4, 1, 7, 2, 6, 3]
[5, 1, 6, 0, 2, 4, 7, 3]
[5, 1, 6, 0, 3, 7, 4, 2]
[5, 2, 0, 6, 4, 7, 1, 3]
[5, 2, 0, 7, 3, 1, 6, 4]
[5, 2, 0, 7, 4, 1, 3, 6]
[5, 2, 4, 6, 0, 3, 1, 7]
[5, 2, 4, 7, 0, 3, 1, 6]
[5, 2, 6, 1, 3, 7, 0, 4]
[5, 2, 6, 1, 7, 4, 0, 3]
[5, 2, 6, 3, 0, 7, 1, 4]
[5, 3, 0, 4, 7, 1, 6, 2]
[5, 3, 1, 7, 4, 6, 0, 2]
[5, 3, 6, 0, 2, 4, 1, 7]
[5, 3, 6, 0, 7, 1, 4, 2]
[5, 7, 1, 3, 0, 6, 4, 2]
[6, 0, 2, 7, 5, 3, 1, 4]
[6, 1, 3, 0, 7, 4, 2, 5]
[6, 1, 5, 2, 0, 3, 7, 4]
[6, 2, 0, 5, 7, 4, 1, 3]
[6, 2, 7, 1, 4, 0, 5, 3]
[6, 3, 1, 4, 7, 0, 2, 5]
[6, 3, 1, 7, 5, 0, 2, 4]
[6, 4, 2, 0, 5, 7, 1, 3]
[7, 1, 3, 0, 6, 4, 2, 5]
[7, 1, 4, 2, 0, 6, 3, 5]
[7, 2, 0, 5, 1, 4, 6, 3]
[7, 3, 0, 2, 5, 1, 6, 4]
Totally have 92 solutions!

❽ python 8位怎么表示

二进制,十进制。
答案python2.5及更早版本:可以使用int(01010101111,2)python2.5及更早版本:用noway来表示二进制文本。python2.6测试版:可以这样做:0b1100111或0b1100111...python2.6测试版:也允许0o27或0o27(第二个字符是字母o)表示八进制。python3.0测试版:与2.6相同,但不再允许老版本027八进制的语法。
进制转换:进制转换是人们利用符号来计数的方法。进制转换由一组数码符号和两个基本因素“基数”与“位权”构成。基数是指,进位计数制中所采用的数码(数制中用来表示“量”的符号)的个数。位权是指,进位制中每一固定位置对应的单位值。简单转换理念:把二进制三位一组分开就是八进制,四位一组就是十六进制二。

❾ 求高手解八皇后问题(python)

pos是从0到num-1走的

pos=0时程序走这一段:
for result in queens(num, state + (pos,)):
yield (pos,) + result

就是先找第一个位置

❿ python 数字转为8位二进制

defdec2bin(num):
l=[]
ifnum<0:
return'-'+dec2bin(abs(num))
whileTrue:
num,remainder=divmod(num,2)
l.append(str(remainder))
ifnum==0:
return''.join(l[::-1])

希望可以帮到你

热点内容
随机启动脚本 发布:2025-07-05 16:10:30 浏览:516
微博数据库设计 发布:2025-07-05 15:30:55 浏览:19
linux485 发布:2025-07-05 14:38:28 浏览:299
php用的软件 发布:2025-07-05 14:06:22 浏览:751
没有权限访问计算机 发布:2025-07-05 13:29:11 浏览:425
javaweb开发教程视频教程 发布:2025-07-05 13:24:41 浏览:687
康师傅控流脚本破解 发布:2025-07-05 13:17:27 浏览:234
java的开发流程 发布:2025-07-05 12:45:11 浏览:680
怎么看内存卡配置 发布:2025-07-05 12:29:19 浏览:277
访问学者英文个人简历 发布:2025-07-05 12:29:17 浏览:828