飘逸的python - 八皇后问题简洁解法

思路:

  • 使用DFS.
  • 用一维数组表达坐标,其中下标为行,元素为列.A[i]=j表示将第i行的皇后放在j列上.
  • 一行一行依次遍历(从上往下),决定放在哪列(从左往右),这样就不用判断行冲突,只需要判断列冲突和主斜线副斜线冲突.
  • (行-列)标识主斜线, (行+列)标识副斜线.

下面上代码.

#coding=utf-8

#风格1
def queen(A, cur=0):
    if cur==len(A):
        print A
    else:
        for col in range(len(A)):
            A[cur] = col #表示把第cur行的皇后放在col列上
            ok = True
            for r in range(cur):
                if A[r]==col or r-A[r]==cur-A[cur] or r+A[r]==cur+A[cur]:#判断是否跟前面的皇后冲突
                    ok = False
                    break
            if ok:
                queen(A, cur+1)

#风格2
def queen(A, cur=0):
    if cur==len(A):
        print A
    else:
        for col in range(len(A)):
            A[cur] = col #表示把第cur行的皇后放在col列上
            for r in range(cur):
                if A[r]==col or r-A[r]==cur-A[cur] or r+A[r]==cur+A[cur]:#判断是否跟前面的皇后冲突
                    break
            else:
                queen(A, cur+1)

#风格3
def queen(A, cur=0):
    if cur==len(A):
        print A
    else:
        for col in range(len(A)):
            A[cur] = col #表示把第cur行的皇后放在col列上
            if all(A[r]!=A[cur] and r-A[r]!=cur-A[cur] and r+A[r]!=cur+A[cur] for r in range(cur)):#判断是否跟前面的皇后冲突
                queen(A, cur+1)

queen([None]*8)

这三种风格差别在于"判断是否跟前面的皇后冲突"这里.

分别是ok flag -> for...else... -> all(推导式).

孰好孰坏呢?

时间: 2024-10-02 23:26:44

飘逸的python - 八皇后问题简洁解法的相关文章

N皇后 八皇后 位运算解法

问题描述 什么是八皇后? 题目链接 N皇后 解法 ? 直接在N*N的棋盘上进行深搜,试探着下棋,也就是回溯法. ? 对于一个皇后来说,我们需要判断她的 八个方向 ,即 主对角线,副对角线,行,列 ? 1. 确定状态 ? 第一眼的感觉是要用 四个数组来储存情况,但时间上只需要三个 ,把 行 排除在外 ? 因为每次搜索的时候,都自动按行搜索,也就是变量 row ,每改变一次,代表了不同的行 ? 接下来,分析主对角线 ,对于N*N的矩阵来说,主对角线上的值满足 行和列的差为定值 ? 即,做减法得到的下

python 八皇后

def eight_queen(): def if_inline(point1, point2): if(point1[0] == point2[0] or\ abs(point1[0] - point2[0]) == abs(point1[1] - point2[1])): return True return False def judge_point(point, point_list): for item in point_list: if(if_inline(point, item))

Python学习二(生成器和八皇后算法)

看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 def table(m, lst): '''绘制m列的棋盘,每行有个皇后旗子''' head = '┌' + '─┬' * (m-1) + '─┐' row = lambda x: '│' + ' │' * x + '╳│' + ' │' * (m - x - 1) trow = '├' + '─

C#中八皇后问题的递归解法——N皇后

百度测试部2015年10月份的面试题之——八皇后. 八皇后问题的介绍在此.以下是用递归思想实现八皇后-N皇后. 代码如下: using System;using System.Collections.Generic; namespace QueensSolution { class Program { static int count = 0; static void Main(string[] args) { int n = Int32.Parse(Console.ReadLine()); L

八皇后问题python实现

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

八皇后问题的Python实现和C#实现

看到八皇后问题的解决思路, 感觉很喜欢. 我用C#实现的版本之前贴在了百度百科上(https://baike.baidu.com/item/%E5%85%AB%E7%9A%87%E5%90%8E%E9%97%AE%E9%A2%98#2_7).百度百科已经有Python版本, 且效率比我的高一点儿, 所以决定把我的版本在博客园贴出来.相信我的版本更容易理解. 希望能够对大家有所帮助.上代码: Python: # EightQueens.py def checkConflict(queenList,

八皇后,回溯与递归(Python实现)

八皇后,回溯与递归(Python实现) 八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语言的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩展为九皇后,十皇后问题. 问题:在一个8*8棋盘上,每一行放置一个皇后旗子,且它们不冲突.冲突定义:同一列不能有两个皇后,每一个对角线也不能有两个皇后.当然,三个皇后也是不行的,四个也是不行的,凭你的智商应该可以理解吧. 解决方案:回溯与递归. 介绍: 1.回溯法 回溯

八皇后问题——回溯法(python&amp;&amp;JAVA)

八皇后问题,是一个古老而著名的问题,问题如下: 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 上边是一个8*8的国际棋盘,可以看到棋盘中的每个格子都标有数字.每个数字都是两位,十位数字表示该格子所在的行,而个位数字表示该格子所在的列. 这样不难发现,处在同一行的两个格子其十位数都相同,处在同一列的两个格子其个位数都相同,处在同一斜线的两个格子有:|两个数字个位数的差|=|两个数字十位数的差|. 主要的三个限制条件明白了

python解决八皇后问题

经典回溯算法:八皇后问题 算法要求: 在国际象棋棋盘上(8*8)放置八个皇后,使得任意两个皇后之间不能在同一行,同一列,也不能位于同于对角线上. 国际象棋的棋盘如下图所示: 问共有多少种不同的方法,并且指出各种不同的放法. # -*- coding:utf-8 -*- __author__ = "tyomcat" print("******八皇后问题的解决方法******") def next_col(current, n=8): length = len(curr