zoukankan      html  css  js  c++  java
  • 八皇后问题

    八皇后问题#

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

    历史#

    八皇后问题最早是由国际象棋棋手马克斯·贝瑟尔(Max Bezzel)于1848年提出。第一个解在1850年由弗朗兹·诺克(Franz Nauck)给出。并且将其推广为更一般的n皇后摆放问题。诺克也是首先将问题推广到更一般的n皇后摆放问题的人之一。
    在此之后,陆续有数学家对其进行研究,其中包括高斯和康托,1874年,S.冈德尔提出了一个通过行列式来求解的方法,这个方法后来又被J.W.L.格莱舍加以改进。
    1972年,艾兹格·迪杰斯特拉用这个问题为例来说明他所谓结构化编程的能力[3]。他对深度优先搜索回溯算法有着非常详尽的描述。
    八皇后问题在1990年代初期的著名电子游戏第七访客和NDS平台的著名电子游戏《雷顿教授与不可思议的小镇》中都有出现。

    代码#

    #!/usr/bin/env python2
    # -*- coding: utf-8 -*-
    """
    
    
    @author: gsharp
    """
    #* 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
           
    
  • 相关阅读:
    常见银行编码收集
    kafka集群在消息消费出现无法找到topic分区的处理解决
    find命令通过排序只保留最新的文件目录
    Git fetch和git pull的区别
    git 常用命令
    wordpress模板修改及函数说明
    webbench进行压力测试
    git存储用户名与密码
    导出putty配置
    一个成功的Git分支模型
  • 原文地址:https://www.cnblogs.com/sonnet/p/8996950.html
Copyright © 2011-2022 走看看