• 八皇后问题


    八皇后问题#

    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
           
    
  • 相关阅读:
    WebSocket属性的简介及使用
    JAVA_基础逻辑运算符与位运算符使用
    JAVA_基础数据类型介绍与基本数据类型之间的运算规则
    ES6特性整理
    Vue-cli中的安装方法
    Kubernetes核心原理(一)之API Server
    Kubernetes核心原理(四)之Kubelet
    kubernetes-整体概述和架构详解
    Kubernetes dashboard认证访问
    kubeadm HA master(v1.14.0)离线包 + 自动化脚本 + 常用插件 For Centos/Fedora
  • 原文地址:https://www.cnblogs.com/sonnet/p/8996950.html
Copyright © 2020-2023  润新知