八皇后问题的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, 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#的效率差别越大。

原文地址:https://www.cnblogs.com/Freeway/p/eightqueens.html

时间: 2024-10-29 19:08:04

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

八皇后问题python实现

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

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

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

八皇后,回溯与递归(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

【Python】生成器、回溯和八皇后问题

八皇后问题: 把N个皇后,放在N*N的棋盘上面,从第一行往下放,每个皇后占一行,同时,每个皇后不能处在同一列,对角线上,有多少种放置方法. 思路: 典型的回溯问题: 1.当要放置最后一个皇后时候,默认前N-1个皇后已经全部放置好了,那么验证在第N行上的每个位置是否可行,即是否与之前的皇后在同一列或者对角线即可: 2.如果放置的不是最后一个皇后,则回溯.回溯至刚开始放第一个元素时候,然后不断的返回上一层.每一层都认为下一层传递给自己的是正确的信息 1 def isconflict(state, n

八皇后问题(python)

问题描述 有一个 8x8 的棋盘,往里放 8 个棋子,每个棋子所在的行.列.对角线都不能有另一个棋子.如下,第一幅图是满足条件的一种方法,第二幅图是不满足条件的. 八皇后问题就是期望找到所有符合条件的情况. 将摆法抽象为数据结构 很显然,满足条件的摆法一定是每行有一个棋子. 我们可以定义一个列表,列表的索引代表行号(从 0 开始),值代表摆放的列位置(从 0 开始). 例如可以用列表[0,1,2,3,4,5,6,7]代表下面这种情况: O * * * * * * * * O * * * * *

Python----递归------Eight Queens 八皇后问题

递归思想是算法编程中的重要思想. 作为初学者,对递归编程表示很蒙逼,每次遇到需要递归的问题,心里就有一万头草泥马飞过~~~~~~(此处略去一万头草泥马) 在B站看数据结构与算法的视频时,视频中给了两个非常典型的例子--<汉诺塔>和<八皇后问题>,就希望自己用Python实现一下这两个递归程序,其中汉诺塔问题比较简单,还是能够理解,这里就不讲了. <八皇后问题>:说要在一个棋盘上放置8个皇后,但是不能发生战争,皇后们都小心眼,都爱争风吃醋,如果有人和自己在一条线上(水平.

八皇后,回溯与递归

python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩展为九皇后,十皇后问题. 问题:在一个8*8棋盘上,每一行放置一个皇后旗子,且它们不冲突.冲突定义:同一列不能有两个皇后,每一个对角线也不能有两个皇后.当然,三个皇后也是不行的,四个也是不行的,应该凭智商应该可以理解吧. 解决方案:回溯法和递归法 1 import random 2 3 def conflict(state,col): 4 row=len(state)