首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

皇后问题Python实现

皇后问题描述 问题: 国际象棋棋盘是8 * 8方格,每个方格里放一个棋子。皇后这种棋子可以攻击同一行或者同一列或者斜线(左上左下右上右下四个方向)上棋子。...在一个棋盘上如果要放皇后,使得她们互相之间不能攻击(即任意两两之间都不同行不同列不同斜线),求出一种(进一步,所有)布局方式。 首先,我们想到递归和非递归两类算法来解决这个问题。...很自然,我们可以基于行来做判断标准。皇后都不同行这是肯定,也就说每行有且仅有一个皇后,问题就在于皇后要放在哪个列。当然个列下标也都不能有相同,除此之外还要保证斜线上不能有重叠皇后。   ...第一个需要解决小问题就是,如何用数学语言来表述斜线上重叠皇后。...□ □ □ ■ □ □ □ □ □ □ □ □ □ □ □ ■ □ □ ■ □ □ □ □ □ □ □ □ □ ■ □ □ □ □ 所有结果 上面的程序多只是生成了一个结果,而实际上皇后可以有很多种可能布局

1.2K20

皇后

概念 皇后问题,是一个古老而著名问题,是回溯算法经典案例。...该问题是国际西洋棋,棋手马克思·贝瑟尔1848念提出:在8*8格国际象棋上摆放皇后,使其不能互相攻击,即:任意两个皇后不能处于同一行、同一列或同一斜线上,不能互相攻击;问有多少种摆法。...皇后问题思路分析 (1)第一个皇后先放第一行第一列 (2)第二个皇后放在第二行第一列,然后判断是否符合规则,不符合则继续放在第二列、第三列、一次把所有咧都放完,找到一个合适位置。...(3)继续第三个皇后,还是第一列、第二列......直到第皇后也能放在一个不冲突位置,算是找到了正解。...(4)当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列所有正解,全部得到。

43930
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    皇后问题

    1.问题描述 皇后问题,是一个古老而著名问题,是回溯算法典型案例。...该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格国际象棋上摆放皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。...2.解法一 2.1解题思路 首先我们分析一下问题解,我们每取出一个皇后,放入一行,共有种不同放法,然后再放第二个皇后,同样如果不考虑规则,还是有种放法。于是我们可以用一个叉树来描述这个过程。...从根节点开始,树每增加一层,便是多放一个皇后,直到第8层(根节点为0层),最后得到一个完全叉树。 紧接着我们开始用深度优先遍历这个叉树,在遍历过程中,进行相应条件判断。...由于皇后任意两个不能处在同一行,那么这肯定是每一个皇后占据一行。于是我们可以定义一个数组ColumnIndex[8],数组中第i个数字表示位于第i行皇后列号。

    49140

    皇后问题

    因此,如果state[0] == 3,就说明第一行皇后放在第四列(还记得吧,我们从0开始计数)。在特定递归层级(特定行),你只知道上面各皇后位置,因此状态元组长度小于8(即皇后总数)。...5.基线条件 皇后问题解决起来有点棘手,但通过使用生成器并不太难。然而,如果你不熟悉递归,就很难自己想出这里解决方案。另外,这个解决方案效率不是特别高,因此皇后非常多时,其速度可能有点慢。...下面先来看基线条件:最后一个皇后。对于这个皇后,你想如何处理呢?假设你想找出所有可能解——给定其他皇后位置,可将这个皇后放在什么位置(可能什么位置都不行)?可以这样编写代码。 ?...这段代码意思是,如果只剩下最后一个皇后没有放好,就遍历所有可能位置,并返回那些不会引发冲突位置。参数num为皇后总数,而参数state为一个元组,包含已经放好皇后位置。...对于当前皇后每个合法位置,递归调用返回是由下面的皇后位置组成元组。

    61310

    皇后问题

    问题描述: 皇后问题,是一个古老而著名问题,是回溯算法典型案例:在8X8格国际象棋棋盘上摆放皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。...问题求解: 采用回溯算法,即从第一行开始,依次探查可以放置皇后位置,若找到,则放置皇后,开始探查下一行;若该行没有位置可以放置皇后,则回溯至上一行,清除该行放置皇后信息,从该行原本放置皇后下一个位置开始探查可以放置皇后位置...求所有解时,每找到一组解,就清除这一组解最后一个皇后位置信息,开始探查该行另外一个可以放置皇后位置,依次回溯求解。...public class ThreeQueen { /** * @param args */ private int[] a=new int[8]; //存储弟i行皇后位于第...=new ThreeQueen(); queen.Search(0); } public void Search(int m){ if(m>=8){ System.out.println(“皇后一组解为

    29120

    皇后问题

    皇后问题就是在8×8国际象棋棋盘上放置8个皇后,保证任意2个皇后都无法互相攻击问题。...在第一行可行位置放置皇后 在第二行可行位置放置皇后 以此类推,在前i行放好i个皇后且保证他们不会互相攻击后,在第i+1行寻找皇后摆放位置。...如果不存在满足上述条件格子,则返回第i行继续寻找下一个不会被攻击格子,如果不存在该格子,则继续返回第i-1行 为了记录格子[i,j]是否会被其他皇后攻击,我们需要以下数组: 变量 对应状态 row...dpos针对是穿过当前格子斜向左下线,同一条线上格子都满足i+j相同。 dneg针对是穿过当前格子斜向右下线,同一条线上格子都满足i-j+(N-1)相同。...加上N-1原因是为了防止数组下标为负数。 对于特定格子而言,只要其满足上面四个bool数组均为false,则可以放置皇后

    35610

    皇后问题(python 生成器)

    问题: 在8×8格国际象棋上摆放皇后,使其不能互相***,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。大致是下面这种样式: ?...思路: 第一步:皇后位置存放问题 用列表或元组表示。索引表示皇后所在横行。列表值表示 皇后 竖列。...伪代码为说明:(假设总要摆放皇后个数为num =8 ) 以上图为例,皇后按 行 一个一个摆放。...这里 ,要再回想回想 递归要求,必须是 递归条件一步步满足停止递归要求,否则递归 就是无限循环。 这里,我们要摆放完所有的皇后,必须是基于最后一个皇后位置存在,然后,倒着存入 所有的位置。...而在摆放第N+2个皇后时,能确认只有,pos + each 位置。 当 each = 最后一个皇后时,就会从最后一个位置反着添加所有皇后位置,从而生成整个符合条件位置。

    1.2K20

    应用Python递归求解“皇后”问题

    皇后问题是一个古老问题(1848年),也是算法和编程领域经典话题,常常是应用递归求解范例。...问题拓展:皇后问题可以推广为更一般n皇后摆放问题:这时棋盘大小变为n1×n1,而皇后个数也变成n2。 ?...皇后问题一个解(网图侵删) 求解皇后问题,实际上,因为棋盘和皇后维度不大,倘若采用暴力计算方式其实也是可行:因为皇后分布在8×8棋盘上,那么从排列组合角度上其实就是64个棋位中选择8...如果稍加筛选,那么其实皇后必定是每行1个且每列也是1个,这样对于皇后分布位置实际上就是8!×8!...皇后递归求解流程(拙图) 按此思路,利用python实现,求得最终皇后方案数有92种。

    1K20

    递归之皇后

    前言:   对于接触过编程朋友来说,最开始了解算法莫过于贪心或者递归;而提到递归,除了本博文前面介绍汉诺塔问题以外,还有一个比较有趣问题——皇后问题。...现在就跟大家理一理,分享一下代码实现思路。 1. 问题介绍: 皇后问题指如何能够在 8×8 国际象棋棋盘上放置皇后,使得任何一个皇后都无法直接吃掉其他皇后?...) Step2 递归跳出边界 由于递归过程中,每一种符合方案都必须遍历到最后一行,因此判断边界为”i==8” Step3 放置皇后向下递归规则 根据定义,“任两个皇后都不能处于同一条横行、纵行或斜线上...代码实现 3.1列出满足皇后问题所有方案 1 #include 2 #include 3 #include 4 #define N 8...y || fabs(x-i)==fabs(y-q[i])){ 32 return 0; 33 } 34 return 1; 35 } 3.3结果展示: 结语: 关于皇后问题

    17610

    皇后算法解析

    这里分析一波皇后算法来加深一下理解。 皇后算法描述如下:在8×8格国际象棋上摆放皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法!...下面来分析一波,假设此时我们想要在黑色方块位置放置一个皇后: 如果一列一列放置皇后的话,图中黑色位置能放置一个皇后合法性条件为: 1、绿色线条经过方格没有皇后 (不处于同一斜线) 2...思路也很简单: 假设黑色方块位置为n列,nRow行,假设位于m列所在行是否有皇后位于紫色线或者绿色上,那么就符合下面条件: //假设此时即将在n列放置一个皇后,n>m ]//获取m列上皇后所在行...Queen(); queen.eightQueen(0); System.out.println("总共有 " +queen.count+ " 摆放方法"); } 所以结合皇后实现来看看到底什么是回溯算法...但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走技术为回溯法 比如皇后算法来说,我们根据约束条件判断某一列某一行是否可以放置皇后,如果不可以就继续判断当前列下一行是否可以放置皇后

    72120

    皇后问题(回溯)

    在做这道题之前搜了一下回溯和递归区别,递归就是一个劲往下搜,搜到头了走不通了,再倒回来换条路继续搜,而回溯就是搜到结果以后再回头重新换个点继续重新搜。        ...这道题是紫书上P191一道例题,也是一道经典回溯搜索题,题描述就是有一个8*8棋盘,然后有8枚棋子,问一行或者一排或者对角线上只能放一枚棋子,能有多少种放法。        ...思路就是按列去搜索,对于选定列,然后再依次对行进行遍历,判断这个点是否满足条件,满足的话就选定该点进行下一列搜索。...对于判断是否满足条件的话,这里我用pre[x]=y,表示y行x列,所以当|pre[x] - pre[y]| == |x - y|时候,肯定是在一条对角线上。...判断是否在同一行或者同一列就很好判断了,剩下就看代码吧。

    50720

    皇后问题-Java

    皇后问题 皇后问题(英文:Eight queens),是由国际象棋棋手马克斯·贝瑟尔于1848年提出问题,是回溯算法典型案例。...问题表述为:在8×8格国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。...1854年在柏林象棋杂志上不同作者发表了40种不同解,后来有人用图论方法解出92种结果。如果经过±90度、±180度旋转,和对角线对称变换摆法看成一类,共有42类。...皇后之间需满足: 不在同一行上 不在同一列上 不在同一斜线上 代码 /** * @BelongsProject: * @BelongsPackage: * @Author: tangshi...//是否可以放置当前位置标识 boolean is = true; //从第index列开始放,所以只需要判断小于index-1列皇后是否符合规则

    38540

    python基础: 遍历与皇后问题浅析

    遍历思想与皇后问题       作为对《python基础教程》关于皇后一节补充说明,本文旨在使人从直觉上理解皇后及其相关问题更进一步。       ...如图,在树遍历中,每一个从根节点到达叶子路径,就是一个解。 用python解决皇后 步骤: 1. 判断皇后冲突 2. 递归得到结果 3....输出所有结果 关于皇后冲突判定      用自然语言很容易描述皇后位置制约关系,即棋盘每一行,每一列,每一个条正斜线,每一条反斜线,都只能有1个皇后。...关于yield还有疑问, 百度或任何一本python基础教程书都会告诉你。...用yield而不用return目的是我们想得到皇后所有位置情况。

    1.4K10

    算法-编程灵魂--皇后

    对于我们程序员来说,算法是编程灵魂,算法好坏与否,也决定了你代码健壮性。 ----至此,祝愿各位五一节快乐,玩开心!...下面,看看下面的经典算法,经典算法很多,写多了大家也不会看完看细,所以就发一个大家回味而已。...Algorithm Gossip: 皇后 说明西洋棋中皇后可以直线前进,吃掉遇到所有棋子,如果棋盘上有皇后,则这皇后如何相安无事放置在棋盘上,1970年与1971年, E.W.Dijkstra...解法关于棋盘问题,都可以用递回求解,然而如何减少递回次数?在皇后问题中,不必要所有的格子都检查过,例如若某列检查过,该该列其它格子就不用再检查了,这个方 法称为分支修剪。...右上至左下是否有皇后 int lup[2*N+1]; // 左上至右下是否有皇后 int queen[N+1] = {0};int num; // 解答编号 void backtrack(int);

    85050

    P1219 皇后

    题目描述 检查一个如下6 x 6跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线所有平行线)上至多有一个棋子。...请编一个程序找出所有跳棋放置解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解总个数。...//以下的话来自usaco官方,不代表洛谷观点 特别注意: 对于更大N(棋盘大小N x N)你程序应当改进得更有效。不要事先计算出所有解然后只输出(或是找到一个关于它公式),这是作弊。...如果你坚持作弊,那么你登陆USACO Training帐号删除并且不能参加USACO任何竞赛。我警告过你了!...第四行只有一个数字,表示解总数。

    82990
    领券