python8皇后不攻击问题_Python 解决八皇后问题

问题介绍

八皇后问题是一个以国际象棋为背景的问题:如何能够在 \(8\times8\) 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的 n 皇后摆放问题。

要解决 n 皇后问题,首先在棋盘中放入一个新皇后,且这个位置不会被先前放置的皇后吃掉,将这个新皇后的位置压入堆栈。但是,如果放置新皇后的该行(或该列)的 8 个位置都没有办法放置新皇后(放入任何一个位置,都会被先前放置的旧皇后给吃掉),此时就必须从堆栈中弹出前一个皇后的位置,并在该行(或该列)中重新寻找另一个新的位置来放,再将该位置压入堆栈中,而这种方式就是一种回溯 (Backtracking) 算法的应用。

代码示例

代码来自于 References[2] 。

global queen

global number

EIGHT=8 #定义堆栈的最大容量

queen=[None]*8 #存放8个皇后的行位置

number=0 #计算总共有几组解的总数

#决定皇后存放的位置

#输出所需要的结果

def print_table():

global number

x=y=0

number+=1

print('')

print('八皇后问题的第%d组解\t' %number)

for x in range(EIGHT):

for y in range(EIGHT):

if x==queen[y]:

print('',end='')

else:

print('',end='')

print('\t')

input('\n..按下任意键继续..\n')

#测试在(row,col)上的皇后是否遭受攻击

#若遭受攻击则返回值为1,否则返回0

def attack(row,col):

global queen

i=0

atk=0

offset_row=offset_col=0

while (atk!=1)and i

offset_col=abs(i-col)

offset_row=abs(queen[i]-row)

#判断两皇后是否在同一行或在同一对角线上

if queen[i]==row or offset_row==offset_col:

atk=1

i=i+1

return atk

def decide_position(value):

global queen

i=0

while i

if attack(i,value)!=1:

queen[value]=i

if value==7:

print_table()

else:

decide_position(value+1)

i=i+1

#主程序

decide_position(0)

运行结果如下所示:

【References】

[2] 吴灿铭. 图解数据结构 : 使用Python[M]. 北京 : 清华大学出版社, 2018

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值