Python 解决八皇后问题

   八皇后问题是一个以国际象棋为背景的问题:如何能够在 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

你可能感兴趣的:(综合,python,开发语言,改行学it)