看到八皇后问题的解决思路, 感觉很喜欢。 我用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. Spring杂记BeanFactory之getBean方法

    1.(BeanFactory) getBean(beanName) 2.(AbstractBeanFactory) doGetBean 3.(AbstractBeanFactory) transfor ...

  2. php生成mysql数据字典

    <?php /** * 生成mysql数据字典 */ // 配置数据库 $database = array(); $database['DB_HOST'] = '127.0.0.1'; $dat ...

  3. Django 学习笔记(三) --- HTML 模版加载 css、js、img 静态文件

    人生苦短 ~ Tips:仅适用于 Python 3+(反正差别不大,py2 改改也能用).因为据 Python 之父 Guido van Rossum 说会在 2020 年停止对 Python 2 的 ...

  4. netty源码解解析(4.0)-9 ChannelPipleline的默认实现-链表管理

    io.netty.channel.DefaultChannelPipeline implements ChannelPipleline   DefaultChannelPiple给出了ChannelP ...

  5. About me & 一些置顶的博文

    About me 一只历史上最弱的 \(\text{hnoier}\) ... 身在 \(\text{hn}\) 弱校,除了在四大名校夹缝中生存,还要受到同校 \(\text{Julao}\) 的鄙视 ...

  6. [转]Angular2-组件间数据传递的两种方式

    本文转自:https://www.cnblogs.com/longhx/p/6960288.html Angular2组件间数据传递有多种方式,其中最常用的有两种,一种是配置元数据(或者标签装饰),一 ...

  7. (转)Visual Studio 2013新功能预览:增代码的透明度和可追溯性

    微软打破了Visual Studio两年升级一次的传统,Visual Studio 2012发布还不足一年,微软就计划发布了Visual Studio 2013了.在今天的TechEd大会上,微软宣布 ...

  8. Java框架之Spring(三)

    本文主要介绍Spring中, 1 Bean 的 init-method 和 destroy-method 2 集合类型的装配 3 注解方式装配 4 以自动扫描把组件纳入spring容器中管理 5 代理 ...

  9. Team Foundation Server 2013 KEY(密钥)

    isual Studio Ultimate 2013 KEY(密钥):BWG7X-J98B3-W34RT-33B3R-JVYW9 Visual Studio Premium 2013 KEY(密钥): ...

  10. mysql 之库, 表的简易操作

    一. 库的操作 1.创建数据库 创建数据库: create database 库名 charset utf8;   charset uft8  可选项 1.2 数据库命名规范: 可以由字母.数字.下划 ...