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
           
    
  • 相关阅读:
    剑指offer——最小的K个数和数组中第K大的元素
    Leetcode刷题指南链接整理
    160. Intersection of Two Linked Lists
    100. Same Tree
    92. Reverse Linked List II
    94. Binary Tree Inorder Traversal
    79. Word Search
    78,90,Subsets,46,47,Permutations,39,40 DFS 大合集
    0x16 Tire之最大的异或对
    0x16 Tire
  • 原文地址:https://www.cnblogs.com/sonnet/p/8996950.html
Copyright © 2011-2022 走看看