八皇后问题_利用Python生成器完美分析解决

python 使用递归回溯完美解决八皇后的问题 八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法。 规则分析: 任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元素代表一行,就能达到要求 任意两个棋子不能在同一列也比较好处理,设置的队列里每个元素的数值代表着每行棋子的列号,比如(0,7,3),表示第一行的棋子放在第一列,第二行的棋子放在第8列,第3行的棋子放在第4列(从0开始计算列号) 任意两个棋子不能在同一斜线上,可以把整个棋盘当作是一个XOY平面,原点在棋盘的左上角 阅读详情

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


什么是八皇后问题?

八皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。
问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换的摆法看成一类,共有42类。计算机发明后,有多种计算机语言可以编程解决此问题。


``

一、生成器是什么,如何使用?

生成器是专门用于迭代的函数,相应的能够作为生成器的函数必须带有yield关键字,那么有了生成器有什么好处呢?

我们先看一个示例:
从列表里找同5相同的一个数将其索引号打印出来

list1 = [1,2,3,4,5,6,3,4,2,5,7,5,8,5]

def findNumber(lis1,iNum):
    for l1 in range(len(list1)):
        if list1[l1] == iNum:
            return l1

print(findNumber(list1, 5));

上例中我将找到的索引数利用Return 找了出来,这个非常简单

那么我们增加点难度,将所有与5相同的索引号通过一个列表打印出来应该怎么做呢?

此时最先想法是用Return语句已经不合适了,因为一旦Return了那列表查询就结束了,要再调用只是重新来一次,这样后面的索引我们永远也拿不到了~
总有方法可以办到,我们可以创建一个列表,然后在For 语句里去一个个查找将找到的索引号加入到列表里不就完成了?

list1 = [1,2,3,4,5,6,3,4,2,5,7,5,8,5]
list2 =[]

def findNumber(lis1,iNum):

    for l1 in range(len(list1)):
        if list1[l1] == iNum:
            list2.append(l1);

    
findNumber(list1, 5)
print(list2);

这也非常完美完成了任务,只是为了找到所要的结果多生成了一个列表。

那么我们再提高下难度,假如我要找的索引号很多,并且我只想先知道前面的几个数,后面的数后面再说,应该怎么办呢?(其实这种情况同样适用于我要找的列表很大,如果一次计算出来会耽误很多时间并且会占用很大内存,而我只想得到一个结果再找下一个结果,这样就没必要占用很多资源去一次性处理没有数据 )

这时候就比较复杂了,怎么能让一个函数运行稍微暂停下呢,没有这样的函数吧?
这就需要引入生成器这样强大的功能了,它可以完美解决以上的问题:

我们先来看下代码:

list1 = [1,2,3,4,5,6,3,4,2,5,7,5,8,5]


def findNumber(lis1,iNum):
    for l1 in range(len(list1)):
        if list1[l1] == iNum:
            yield l1


print(list(findNumber(list1, 5)));

通过与上述Return示例的函数进行对比,我们发现函数仅仅是将return更改成了yield关键字,而后我们就可以通过List函数将结果生成列表了

通过对比我们可以发现yield与Return功能有相似之处,都可以返回一个数字,
不同之处在于,yield在返回数字之后我们仍然可以继续进行迭代让返回继续进行

list1 = [1,2,3,4,5,6,3,4,2,5,7,5,8,5]


def findNumber(lis1,iNum):
    for l1 in range(len(list1)):
        if list1[l1] == iNum:
            yield l1

index = findNumber(list1, 5);
print(next(index));
print("i was dealing with the result")
print(next(index));
print("i was dealing with the result")
print(next(index));
print("i was dealing with the result")

将此例与上述的For循环列表进行对比,我们发现其实也没有多大变化,仅仅是在找到索引号后我们利用yield返回数值而已。

但是在功能实现上已经不一样了,前例的For循环在运行时只能是一次性的得到结果,我们不能让其暂停下结果,而如果换成yield后就完全不一样了,我们可以”随取随用“了,就好像我们不用因为吃饭而必须将一整天的面包全部吃下,而是将面包切片,如果我们饿了就一片一片拿过来吃。这太方便了

下面我们就来看下生成器如何解决八皇后的问题:

二、如何分析这种问题将其转化为程序?

首先分析下问题解决方式,8*8的棋盘依次放下一个皇后,我们可以想象生成的结果都可以由8个长度的列表表示,其中索引0-7分别表示在每一列上的列数,而这个列表在每个索引上的数值就可以表示在每一列上的皇后的行位置。这样就可以完美表示一个可能的答案。注意,生成的结果我们尽量在一个小的数据类型上表达,我们可以用一个二维列表表示结果,但列表的维数越多复杂程序及运算性能损耗越多。在放下一个皇后时保证其位置不会与前面所有的皇后有干涉,就是不能被前面的皇后吃到。这里就隐藏到几个条件:

  1. 有一个判断条件,就是在放皇后的时候要判断其位置是否与前面皇后的位置有干涉
  2. 当找到一个位置时就需要将位置与前面的位置叠加到在下一次找位置时做判断
  3. 当找够8个位置时需要将所得到的位置结果保留起来

上述的几个条件整理起来就是我们的解决方法,整理如下:

1.找到排查皇后位置的冲突条件

通过确认冲突条件我们可以确认所找到的位置是否是我们需要的,此处冲突条件是当前位置与前面所有的皇后位置不冲突
如下示例:我们将皇后的位置组合成一个列表,然后通过条件判断所输入的位置与列表内皇后位置是否有冲突
冲突的条件是,当前位置与前面的位置不在同一行且,当前位置不在前面皇后所在位置的对角线上。

# 确认冲突的条件
def conflict(list1,y):
    len1 = len(list1)
    for var in range(len1):
        if y == list1[var] or abs(y-list1[var]) == abs(len1-var) :
            return True;
    return False;
    

2.找到回溯问题的基线

首先根据八次寻找位置我们确定需要构建递归函数,此函数定义了每次回溯寻找位置的方法,而回溯问题的基线就是其结束点,即第8次找位置的方法,其与前面的方法略有不同,需要定义回溯结束的条件,在此问题中基线就是我们已经找到了8个位置

def FoundQueen(List1,m):
    print("list1 value is",List1)
    for var1 in range(8):
        
        if not conflict(List1, var1):
            if len(List1)==m-1 :#基线判断,当找到最后一个皇后位置后应当终止递归函数并返回
                print("search completeed")
                
                yield [var1];

3.找到回溯问题的条件

我们在编写递归函数的时候需要确认下递归调用的条件,当找到与前面皇后不冲突的位置后,在下一次调用递归函数时就需要将刚找到的位置加入到递归的参数中。

#确认最后的基线及迭代条件
def FoundQueen(List1,m):
    print("list1 value is",List1)
    for var1 in range(8):
        
        if not conflict(List1, var1): 
            if len(List1)==m-1 :
                print("search completeed")
                
                yield [var1];
            else:#当找到的位置并非是最后一个皇后时,应当继续调用递归函数,同时将找到的位置加入到下一次递归函数的列表中
                List2=(List1+[var1]).copy();
                print(List2)
                for result in FoundQueen(List2, m):
                    yield [var1]+result;

4.了解列表类型的特殊之处

我们首先需要明确一下可更改对象与不可更改对象的概念:

  • 可更改对象:其存储的内存地址不会因为其数值变化而改变,简言之就是,当更改数值时其存储的内存地址是不会变的;列表,字典数据类型是可更改对象
a = [1,2,3,4]
print(id(a));#id()用于找出变量所在的内存地址
a.append(5);
print(id(a));

输出结果如下:

2455242793984
2455242793984

  • 不可更改对象:类推出来, 其存储的内存地址会因为其数值的变化而发生改变,简言之就是当你更改其数值后,其内部的内存地址也随之更改了。整数,字符串及元组都是不可更改对象
a = 5;
print(id(a));
a=1;
print(id(a));

输出如下
1712037888368
1712037888240

  • 但这样的区别对功能实现上有什么影响吗?来看个示例
a = [1,2,3,4]

def printAddress(var):

    print(id(var));

print(id(a));
a.append(5);
printAddress(a);

b = 5;
print(id(b));
b = 4;
printAddress(b);

3006964425088
3006964425088
3006912463216
3006912463184

从上述的结果可以看出来,当可变对象作为参数输入到函数内部时,函数内部是引用的变量的内存地址,当其数值在函数内变化时变量的数值也发生了变化,这表示当将可变对象传送到函数后其数值可能会发生变化
当不可变对象作为参数输入到函数内部后,当值发生变化后其与外部的变量已经没有关系了,因为函数内部已经引用了另一个内存地址,已经与前面的变量没有关联。

所以在我们的示例中,递归函数在调用后面的函数时我们对前面的列表进行了一次额外的Copy,这个函数的功能就是为后面的参数重新分配一个内存地址,将后面列表与前面的列表变量关第打断,否则后面的更改了数值前面的列表会莫名的被更改,导致前面的函数运算异常,在应用列表及字典时应额外注意这个问题,否则会发生异常但不会报警。如下示例

   else:#当找到的位置并非是最后一个皇后时,应当继续调用递归函数,同时将找到的位置加入到下一次递归函数的列表中
                List2=(List1+[var1]).copy();#重新生成一个列表并仅将List1数值复制过来,将列表前后的关系打断
                for result in FoundQueen(List2, m):
                    yield [var1]+result;

3.如何将找到的结果反馈出来?

  • 从回溯问题的基线来开始讨论:当找到了最后一个皇后位置,我们就需要将所有的数值返回出去生成一个列表,所以在基线上我们将最后皇后的位置创建列表并返回到上级调用
  • 再在上级递归函数上看下如何返回列表,其需要将本次找到的皇后位置和其调用递归函数返回的位置列表返回到上级,这样在最初调用时我们就可以正常得到一组满足条件的皇后位置列表
def FoundQueen(List1,m):
    for var1 in range(8):
        
        if not conflict(List1, var1): 
            if len(List1)==m-1 : 
                yield [var1];#基线上的列表返回
            else:
                List2=(List1+[var1]).copy();
                for result in FoundQueen(List2, m):
                    yield [var1]+result;#递归函数上的列表返回

我们也可以考虑在基线条件上直接将List1及最后的皇后位置全部一次性返回,这样也可以容易理解,代码如下:

#确认最后的基线及迭代条件
def FoundQueen(List1,m):
    for var1 in range(8):
        if not conflict(List1, var1): 
            if len(List1)==m-1 :
                yield List1+[var1];#一次性返回所有的皇后位置
            else:
                List2=(List1+[var1]).copy();
                for result in FoundQueen(List2, m):
                    yield result;#上级调用函数仅将结果返回即可

3.完整代码

代码如下:

#确认最后的基线及迭代条件
def FoundQueen(List1,m):
    for var1 in range(8):
        
        if not conflict(List1, var1): 
            if len(List1)==m-1 :
                yield [var1];
            else:
                List2=(List1+[var1]).copy();
                for result in FoundQueen(List2, m):
                    yield [var1]+result;
        
# 确认冲突的条件
def conflict(list1,y):
    len1 = len(list1)
    for var in range(len1):
        if y == list1[var] or abs(y-list1[var]) == abs(len1-var) :
            return True;
    return False;

queens = list(FoundQueen([], 8))
print(queens);
print(len(queens));

该处使用的url网络请求的数据。


输出结果如下:

[[0, 4, 7, 5, 2, 6, 1, 3], [0, 5, 7, 2, 6, 3, 1, 4], [0, 6, 3, 5, 7, 1, 4, 2], [0, 6, 4, 7, 1, 3, 5, 2], [1, 3, 5, 7, 2, 0, 6, 4], [1, 4, 6, 0, 2, 7, 5, 3], [1, 4, 6, 3, 0, 7, 5, 2], [1, 5, 0, 6, 3, 7, 2, 4], [1, 5, 7, 2, 0, 3, 6, 4], [1, 6, 2, 5, 7, 4, 0, 3], [1, 6, 4, 7, 0, 3, 5, 2], [1, 7, 5, 0, 2, 4, 6, 3], [2, 0, 6, 4, 7, 1, 3, 5], [2, 4, 1, 7, 0, 6, 3, 5], [2, 4, 1, 7, 5, 3, 6, 0], [2, 4, 6, 0, 3, 1, 7, 5], [2, 4, 7, 3, 0, 6, 1, 5], [2, 5, 1, 4, 7, 0, 6, 3], [2, 5, 1, 6, 0, 3, 7, 4], [2, 5, 1, 6, 4, 0, 7, 3], [2, 5, 3, 0, 7, 4, 6, 1], [2, 5, 3, 1, 7, 4, 6, 0], [2, 5, 7, 0, 3, 6, 4, 1], [2, 5, 7, 0, 4, 6, 1, 3], [2, 5, 7, 1, 3, 0, 6, 4], [2, 6, 1, 7, 4, 0, 3, 5], [2, 6, 1, 7, 5, 3, 0, 4], [2, 7,
3, 6, 0, 5, 1, 4], [3, 0, 4, 7, 1, 6, 2, 5], [3, 0, 4, 7, 5, 2, 6, 1], [3, 1, 4, 7, 5, 0, 2, 6], [3, 1, 6, 2, 5, 7, 0, 4], [3, 1, 6, 2, 5, 7,
4, 0], [3, 1, 6, 4, 0, 7, 5, 2], [3, 1, 7, 4, 6, 0, 2, 5], [3, 1, 7, 5, 0, 2, 4, 6], [3, 5, 0, 4, 1, 7, 2, 6], [3, 5, 7, 1, 6, 0, 2, 4], [3, 5, 7, 2, 0, 6, 4, 1], [3, 6, 0, 7, 4, 1, 5, 2], [3, 6, 2, 7, 1, 4, 0, 5], [3, 6, 4, 1, 5, 0, 2, 7], [3, 6, 4, 2, 0, 5, 7, 1], [3, 7, 0, 2, 5, 1, 6, 4], [3, 7, 0, 4, 6, 1, 5, 2], [3, 7, 4, 2, 0, 6, 1, 5], [4, 0, 3, 5, 7, 1, 6, 2], [4, 0, 7, 3, 1, 6, 2, 5], [4, 0, 7, 5, 2, 6, 1, 3], [4, 1, 3, 5, 7, 2, 0, 6], [4, 1, 3, 6, 2, 7, 5, 0], [4, 1, 5, 0, 6, 3, 7, 2], [4, 1, 7, 0, 3, 6, 2, 5], [4, 2, 0, 5, 7, 1, 3, 6], [4, 2, 0, 6, 1, 7, 5, 3], [4, 2, 7, 3, 6, 0, 5, 1], [4, 6, 0, 2, 7, 5, 3, 1], [4, 6, 0, 3, 1, 7, 5, 2], [4, 6, 1, 3, 7, 0, 2, 5], [4, 6, 1, 5, 2, 0, 3, 7], [4, 6, 1, 5, 2, 0, 7, 3], [4, 6, 3, 0, 2, 7, 5, 1], [4, 7, 3, 0, 2, 5, 1, 6], [4, 7, 3, 0, 6, 1, 5, 2], [5, 0, 4, 1, 7, 2, 6, 3], [5, 1, 6, 0,
2, 4, 7, 3], [5, 1, 6, 0, 3, 7, 4, 2], [5, 2, 0, 6, 4, 7, 1, 3], [5, 2, 0, 7, 3, 1, 6, 4], [5, 2, 0, 7, 4, 1, 3, 6], [5, 2, 4, 6, 0, 3, 1, 7], [5, 2, 4, 7, 0, 3, 1, 6], [5, 2, 6, 1, 3, 7, 0, 4], [5, 2, 6, 1, 7, 4, 0, 3], [5, 2, 6, 3, 0, 7, 1, 4], [5, 3, 0, 4, 7, 1, 6, 2], [5, 3, 1, 7, 4, 6, 0, 2], [5, 3, 6, 0, 2, 4, 1, 7], [5, 3, 6, 0, 7, 1, 4, 2], [5, 7, 1, 3, 0, 6, 4, 2], [6, 0, 2, 7, 5, 3, 1, 4], [6, 1, 3, 0, 7, 4, 2, 5], [6, 1, 5, 2, 0, 3, 7, 4], [6, 2, 0, 5, 7, 4, 1, 3], [6, 2, 7, 1, 4, 0, 5, 3], [6, 3, 1, 4, 7, 0, 2, 5], [6, 3, 1, 7, 5, 0, 2, 4], [6, 4, 2, 0, 5, 7, 1, 3], [7, 1, 3, 0, 6, 4, 2, 5], [7, 1, 4, 2, 0, 6, 3, 5], [7, 2, 0, 5, 1, 4, 6, 3], [7, 3, 0, 2, 5, 1, 6, 4]]
92

总结

八皇后问题是一个经典的回溯案例,同时也是计算机编程的经典案例,他可以很好的考察我们对递归及生成器的理解程度。针对这个问题积极思考及自主演练非常重要,如果没有整理思路很可能想很长时间也没有解决办法,想到办法又因为对编程理解不熟悉而得不到结果,但主动编程仍非常必要,这会加深你对一门语言的理解,同时也可以对比所编的程序是否是最快的,是否是最简洁的,是否是最省力的,总这花费一些时间在上面会受益良多。

递归算法——八皇后问题 python 递归算法——八皇后问题python 阅读详情

相关推荐

八皇后问题详解(附有C++详细代码)

八皇后问题是一个经典的回溯算法问题,通过求解该问题,我们可以深入理解回溯算法的基本思想和应用方法。解决八皇后问题的关键在于找到一个有效的算法来搜索所有可能的摆放方式,并在搜索过程中进行剪枝,以避免不必要的搜索。在摆放过程中,需要判断当前位置是否合法,即是否与其他皇后冲突。该问题描述为:在8×8的国际象棋上摆放八个皇后,使其不能互相攻击,即任何两个皇后都不能处于同一行、同一列或同一斜线上。由于八皇后问题有92种不同的摆放方式,因此输出会包含92行,每行8个数字,表示一种摆放方案中每个皇后在棋盘上的列位置。

Weirdo的博客 7537

八皇后问题(Python)

八皇后的几种解法

Vaeeeee的博客 2万+

硬件手册——PT100精密测温电路

PT100精密测温电路 一、需求分析 根据题目要求为:测温范围为0-100℃、测温精度要求为±1℃。由于铂电阻具有精度高、性能可靠、稳定性好的特点,且铂电阻的电阻相对变化率与温度的关系曲线线性度最好,故选择铂电阻作为敏感元件。而在国标中,铂电阻有几种不同的标准,如PT100、PT1000。分别对应着0摄氏度下铂电阻的阻值为100R和1000R,由于需要考虑铂电阻的自发热问题,所以尽量选择阻值小的铂电阻,故选择PT100为最终型号。 二、电路设计 2.1 热电阻接法 热电阻测温电路有多种接法,其中三线制会导致

weixin_41655430的博客 5万+

八皇后问题

基本介绍 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。问有多少种摆法。 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。计算机发明后,有多种计算机语言可以解决此问题。 问题分析 设八个皇后为xi,分别在第i行( I = 1,2,3,4……,8)。 问题的解状态:可

weixin_48276298的博客 1万+

从零编写linux0.11 - 第二章 内核初始化

编程环境:Ubuntu Kylin 16.04 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 1.添加内核 进入内核后也不是马上进入main函数,上一章只是暂时设置gdt,此外还要设置idt和其他的一些初始化操作,这些内容也要使用汇编进行编写,此处采用AT&T格式的汇编。 以下为head.s的内容,为了简单起见,内容还是一个死循环。 .globl startup_32 startup_3

皓空Fly的博客 1266

【NLP】语言模型的发展历程 (1)

N-gram模型是一种基于统计语言模型的文本分析算法,它用于预测文本中下一个词出现的概率,基于前面出现的n-1个词的序列。这里的n代表序列中元素的数量,因此称为N-gram。Unigram:N=1,每个单词的出现概率独立计算,不考虑上下文。Bigram:N=2,基于前一个单词预测当前单词的联合概率模型。Trigram:N=3,考虑前两个单词来预测当前单词的联合概率模型,更复杂但可能更准确。

酒酿小圆子呀~ 1670

经典算法-----八皇后问题(回溯算法)

八皇后问题),是由国际象棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换。

m0_73633088的博客 1万+

SAP Fiori Launchpad 上看不到任何 tile 应该怎么办?

中心UI组件是一个框架,为所有SAPFiori应用程序提供公共基础设施SAPFiorilaunchpad是所有SAPFioriUI的基础,并为SAPFiori应用程序提供基本功能,如登录,界面大小,应用程序之间的导航,和基于角色的应用程序目录。ABAP前端服务器包含所有基础设施组件,用于为客户端生成SAPFiori应用程序特定的UI,并与SAPBusinessSuite后端系统通信。SAPFiori应用程序的处理过程如下首先,客户端加载SAPFiori应用程序的界面。...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 946

八皇后问题是什么?用python代码实现

八皇后问题是一个经典的数学问题,要求在一个8x8的棋盘上放置8个皇后,使得任意两个皇后都不能互相攻击,即不能在同一行、同一列或同一对角线上。运行以上代码,将会输出所有的八皇后问题的解法。每个解法中,Q表示皇后所在的位置,.表示空白位置。

xifenglie123321的博客 1139

【专栏必读】王道考研408计算机网络+湖科大教书匠计算机网络+网络编程万字笔记使用说明及章节导航

本文档汇总了王道考研408计算机网络和湖科大教书匠计算机网络课程的重点内容,包括计算机网络体系结构、物理层、数据链路层、网络层、传输层和应用层的详细讲解。通过ISO/OSI和TCP/IP模型,深入探讨了通信基础、介质访问控制、IP地址、TCP/UDP协议、流量控制和网络编程等关键概念。此外,还提供了Linux网络编程实践,帮助读者巩固理论知识

快乐江湖的博客 2万+

从 ABAP 视角看 JSON :7.40 版本带来的那些改变

摘要:ABAP 对 JSON 的原生支持 随着企业系统与外部 API 的交互增多,ABAP 从 NetWeaver 7.40 开始原生支持 JSON 格式。通过复用现有 XML 基础设施,ABAP 团队引入 JSON-XML 概念,使用 sXML Library 和 IF_SXML=>CO_XT_JSON 常量处理 JSON 数据。开发人员可通过 CALL TRANSFORMATION 语句实现 ABAP 数据与 JSON 的双向转换,大幅简化了与外部系统的数据交互。这种标准化的 JSON 处理方式提

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 180

八皇后问题(回溯法)

目录 什么是八皇后 八皇后问题怎么解决? 什么是回溯法 回溯法的模板 八皇后问题的核心代码 判断皇后位置是否可行 总体实现代码 每日一句: 种一棵树的最好时间是十年前,其次是现在。 什么是八皇后 八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。 问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案

m0_50217592的博客 1万+

一个非常简单的变分量子分类器 (VQC)

​ 在之前的帖子(这里和这里)中,我已经开始谈论 QML,为什么以及如何学习,从现在开始,我将开始分享我的研究和发现,到目前为止,这些都是非常基本的。​

gongdiwudu的专栏 6208

八皇后问题python回溯_python 使用递归回溯完美解决八皇后的问题

八皇后问题描述:在一个8✖️8的棋盘上,任意摆放8个棋子,要求任意两个棋子不能在同一行,同一列,同一斜线上,问有多少种解法。规则分析:任意两个棋子不能在同一行比较好办,设置一个队列,队列里的每个元素代表一行,就能达到要求任意两个棋子不能在同一列也比较好处理,设置的队列里每个元素的数值代表着每行棋子的列号,比如(0,7,3),表示第一行的棋子放在第一列,第二行的棋子放在第8列,第3行的棋子放在第4列...

weixin_39559804的博客 446

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Python进阶之八皇后算法

Python进阶之八皇后算法,学会递归与生成器,搞定该问题很容易

- 2423

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Python(广度优先搜索+回溯+递归)、lingo实现八皇后问题

本文主要是为了介绍广度优先搜索、回溯、递归的算法思想。

m0_62410163的博客 1581

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Python解决八皇后及优化

当我们找到一个可以放置皇后的位置时,我们将列表中相应的项设置为True,并递归搜索下一行。当我们到达最后一行时,我们找到了一个有效的解决方案,将其放入结果列表中。在上面的代码中,我们使用内置的 abs 函数来计算斜率。我们可以用一个 64 位的位掩码来表示棋盘上的每行、每列和每个对角线(两条对角线)的占用情况。我们可以通过双向搜索来找出所有有效的解决方案。这个代码基本上是标准的回溯算法,它会找到所有可能的皇后摆放方案。但是,这个代码的效率不高,因为它生成了所有可能的解,即使某些解明显是不可能的。

yechuanhui的专栏 1050

可视化讲解:什么是八皇后问题?

前言 概念介绍 1. 八皇后问题起源 八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。 问题描述:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上。 请问一共有多少种摆法? 原理讲解 由于篇幅限制,我们将八皇后问题简化为4皇后问题来讲解其原理(八皇后问题和4皇后问题的原理是一致的) 第一步,我们从第一行开始,遍历第一行中所有的列,找到第一.

多米学算法的博客 2581

【附源码】Python :八皇后问题

八皇后问题是在一个 8×8 的棋盘上放置 8 个皇后,要求它们彼此之间不能互相攻击。我们继续使用回溯算法,并进行一些优化。 回溯算法从棋盘的第一行开始,依次尝试在每一列放置一个皇后。在放置皇后时,我们不仅要检查当前位置是否与已经放置的皇后在同一行、同一列或同一对角线上,还可以利用一些对称性来减少搜索空间。例如,如果我们已经知道在第一行第一列放置皇后无法得到解,那么根据棋盘的对称性,在第一行第八列放置皇后也一定无法得到解,这样就可以避免一些不必要的尝试。

脱发快乐中 2831

史上最简明八皇后问题分析与套路总结

1.什么是八皇后问题 八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n = 1或n ≥ 4时问题有解。(问题描述来自参考文献1) 数学王子高斯当年花费了无数心血,最近计算认为八皇后问题有76种解法,现在我们通过计算机模拟可以轻松计算出八皇后问题的真正解法有92种。能让

bitcarmanlee的博客 2万+

3、八皇后问题

一、问题描述 M皇后问题:在M×M格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。根据场景,又有三种衍生问题: 共有多少种摆法(即有多少种可行解) 求出所有可行解 求任意一个可行解 二、问题分析 对于每一个放置点而言,它需要考虑四个方向上是否已经存在皇后。分别是行列,45度斜线和135度斜线。 行:每一行只放一个皇后,直到我们把最后一个皇后放到最后一行的合适位置,则算法结束 列:列相同的约束条件,只需判断列数j是否相等即可。 45度斜线和13

weixin_59786021的博客 3237

算法总结——八皇后问题(三种解法)

问题描述 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。给出一个数b,要求输出第b个串

3万+

递归算法之八皇后问题

递归算法之八皇后问题

weixin_58473601的博客 5404

八皇后问题详解(四种解法)

如果你去百度百科八皇后这个问题,你会发现人家也是历史上有头有脸的一个问题,最后一句“计算机发明后就有一万种方式解决这个问题”读起来也让程序猿们很快活。闲话少说,开始阐述我的思路:最无脑的解法一定是八个for遍历,浪费了太多的计算资源在各种无用功上面,我们稍微构思一下: 首先如何决定下一个皇后能不能放这里可以有两种思路,第一种是尝试维护一个8*8的二维矩阵,每次找到一个空位放下一个皇后就把对应行列对

codes_first的博客 15万+

Python:爬山法/随机重启爬山法/允许侧移的爬山法解决八皇后问题

文章目录1 八皇后问题2 程序代码2.1 程序12.2 程序22.3 程序32.3.1 爬山法2.3.2 随机重启爬山法3 评价 1 八皇后问题 有一个8乘8的棋盘,现在要将八个皇后放到棋盘上,满足:对于每一个皇后,在自己所在的行、列、两个对角线都没有其他皇后。 不了解爬山法、随机重启爬山法的话,请看这里。 规定棋盘的同列只能出现一个皇后。每一个棋盘,对应于一个长度为8的序列,每一个数的范围是[1, 8],第k个数字所代表的含义是第k列中皇后所在的行数,如[3,2,5,4,3,2,1,3]代表棋盘上从第

我是一只小嵩鼠 5703
上一篇: Visual Code Python Snippet 自定义代码片段及套用模板
下一篇: 特斯拉面试,工控经典PLC题目:一键启动功能实现解法分析,少个坑,给自己多个机会
PittDing
博客等级 码龄7年 227粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值