看到八皇后问题的解决思路, 感觉很喜欢。 我用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, nextY):
for posY in range(nextY):
if abs(queenList[posY]-queenList[nextY])==abs(posY-nextY) or queenList[posY] == queenList[nextY]:
return True
return False count = 0
def putQueen(queenCount, queenList, nextY):
for queenList[nextY] in range(queenCount):
if checkConflict(queenList, nextY)==False:
nextY+=1 if nextY < queenCount:
putQueen(queenCount, queenList, nextY)
else:
global count
count+=1
print(str(count)+": " + ", ".join(str(pos) for pos in queenList)) nextY-=1 # call the method
queenCount = 12
queenList = [0] * queenCount
putQueen(queenCount, queenList, 0)

C#:

// EightQueens.cs
namespace EightQueens
{
class EightQueens
{
private bool checkConflict(List<int> queenList, int nextY)
{
for (int positionY = 0; positionY < nextY; positionY++)
{
if (Math.Abs(queenList[positionY] - queenList[nextY]) == Math.Abs(positionY - nextY) || queenList[positionY] == queenList[nextY])
{
return true;
}
}
return false;
} long count = 0;
public void putQueen(int queenCount, List<int> queenList, int nextY)
{
for (queenList[nextY] = 0; queenList[nextY] < queenCount; queenList[nextY]++)
{
if (checkConflict(queenList, nextY) == false)
{
nextY++;
if (nextY < queenCount)
{
putQueen(queenCount, queenList, nextY);
}
else
{
count++;
Console.WriteLine(count.ToString() + ": " + string.Join(", ", queenList));
}
nextY--;
}
}
}
}
}

方法调用:

// Program.cs
namespace EightQueens
{
class Program
{
static void Main(string[] args)
{
int queenCount = 12;
List<int> queenList = new List<int>();
for (int i = 0; i < queenCount; i++)
{
queenList.Add(0);
} new EightQueens().putQueen(queenCount, queenList, 0);
Console.ReadKey();
}
}
}

当Queen的数量越多, 可以看到Python和C#的效率差距越大。18个Queen,运行几分钟之后:

八皇后问题的Python实现和C#实现的更多相关文章

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

    看书看到迭代器和生成器了,一般的使用是没什么问题的,不过很多时候并不能用的很习惯 书中例举了经典的八皇后问题,作为一个程序员怎么能够放过做题的机会呢,于是乎先自己来一遍,于是有了下面这个ugly的代码 ...

  2. Python解决八皇后问题

    最近看Python看得都不用tab键了,哈哈.今天看了一个经典问题--八皇后问题,说实话,以前学C.C++的时候有这个问题,但是当时不爱学,没搞会,后来算法课上又碰到,只是学会了思想,应该是学回溯法的 ...

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

    八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩 ...

  4. 【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)

    八皇后问题是一道经典的回溯问题.问题描述如下:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉?         看到这个问题,最容易想 ...

  5. Python 八皇后问题

    八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法. 规则分析: 任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元 ...

  6. 【算法】八皇后问题 Python实现

    [八皇后问题] 问题: 国际象棋棋盘是8 * 8的方格,每个方格里放一个棋子.皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上的棋子.在一个棋盘上如果要放八个皇后,使得她们互 ...

  7. 带你轻而易举的学习python——八皇后问题

    首先我们来看一下这个著名的八皇后问题 八皇后问题:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同一列或同一斜线上,问有多少种摆法. 在这个问题提出之后人们又将 ...

  8. Python解决八皇后问题的代码【解读】

    八皇后问题 来自于西方象棋(现在叫 国际象棋,英文chess),详情可见百度百科. 在西方象棋中,有一种叫做皇后的棋子,在棋盘上,如果双方的皇后在同一行.同一列或同一斜线上,就会互相攻击. 八皇后问题 ...

  9. python基础教程总结8——特殊方法,属性,迭代器,生成器,八皇后问题

    1. 重写一般方法和特殊的构造方法 1.1 如果一个方法在B类的一个实例中被调用(或一个属性被访问),但在B类中没有找到该方法,那么会去它的超类A里面找. class A: ... def hello ...

随机推荐

  1. 从零开始学 Web 之 BOM(二)定时器

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  2. MySQL 性能管理及架构设计指南

    一.什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS:Queries Per Second意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定 ...

  3. tls1.2 rfc5246

    注:本文省略了部分开发协议才涉及到的内容,如字段类型的定义以及字段长度的运算,主要聚焦理解tls协议的运作方式,用于问题定位 tls协议包含2层协议:TLS Record 协议和TLS Handsha ...

  4. centos7 常用工具包安装

    .虚拟机上传下载组件( 支持从windows直接拖拽文件,相当好用) yum -y install lrzsz rz+文件名(上传) sz+文件名(下载) .gcc (nginx之类由c语言开发的,编 ...

  5. 个人觉得非常好用的mysql客户端工具的HeidiSQL

    感觉比Navicat好用,能显示注释,而且还有绿色版,轻量级 下载地址:http://www.heidisql.com/download.php

  6. Jenkins入门之界面概览

    安装完Jenkins后,打开浏览器,在浏览器地址栏内输入http://localhost:8080/ 便可以打开jenkins 基于web的管理界面(如果你在安装过程中修改了Jenkins默认端口,则 ...

  7. Spark SQL结构化数据处理

    Spark SQL是Spark框架的重要组成部分, 主要用于结构化数据处理和对Spark数据执行类SQL的查询. DataFrame是一个分布式的,按照命名列的形式组织的数据集合. 一张SQL数据表可 ...

  8. Ajax之跨域请求

    一.引子 我现在开启了两个django项目,分别叫Demo1和Demo2,Demo1中有一个路径‘http://127.0.0.1:8000/index/’,对应的视图是index视图返回一个inde ...

  9. Transformation和Action

    spark的运算操作有两种类型:分别是Transformation和Action,区别如下:   Transformation:代表的是转化操作就是我们的计算流程,返回是RDD[T],可以是一个链式的 ...

  10. jQuery点击页面其他部分隐藏下拉菜单

    一.开发小要点 web页面中,我们一般不用select.option来实现下拉菜单效果,因为下拉框的样式丑且难以美化,所以我们选择控制ul显示隐藏来实现同样且高大上的效果,但是不能像下拉框那样点击页面 ...