Python 解决八皇后问题

这篇文章介绍了八皇后问题的起源、数学背景,包括高斯和康托的贡献,以及S.冈德尔和J.W.L.格莱舍的解决方案。还提到了八皇后问题在编程教学中的应用,如艾兹格・迪杰斯特拉的示例,并附有Python测试代码。
摘要由CSDN通过智能技术生成

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

八皇后问题最早是由国际西洋棋棋手马克斯・贝瑟尔于 1848 年提出。之后陆续有数学家对其进行研究,其中包括高斯和康托,并且将其推广为更一般的 n 皇后摆放问题。八皇后问题的第一个解是在 1850 年由弗朗兹・诺克给出的。诺克也是首先将问题推广到更一般的 n 皇后摆放问题的人之一。1874 年,S. 冈德尔提出了一个通过行列式来求解的方法,这个方法后来又被 J.W.L. 格莱舍加以改进。

艾兹格・迪杰斯特拉在 1972 年用这个问题为例来说明他所谓结构性编程的能力。

八皇后问题出现在 1990 年代初期的著名电子游戏第七访客中。

下面是测试代码:

#!/usr/bin/env python
# _*_  coding:utf-8 _*_
#* queen problem with recurison
BOARD_SIZE = 8

def under_attack(col, queens):
   left = right = col
   for r, c in reversed(queens):
       #左右有冲突的位置的列号
       left, right = left - 1, right + 1

       if c in (left, col, right):
           return True
   return False

def solve(n):
   if n == 0:
       return [[]]

   smaller_solutions = solve(n - 1)

   return [solution+[(n,i+1)]
       for i in xrange(BOARD_SIZE)
           for solution in smaller_solutions
               if not under_attack(i+1, solution)]
for answer in solve(BOARD_SIZE):
   print answer

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值