• 八皇后问题的解析与实现


    问题描述

    八皇后问题是一个古老而又著名的问题。

    时间退回到1848年,国际西洋棋棋手马克斯·贝瑟尔提出了这样的一个问题:

    在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问一共有多少种摆法。

    如何找到这所有的摆法?

    如何解这道题

    现在,我们假设自己坐在一个国际象棋棋盘面前,手上有八个皇后作为棋子,尝试解决找到这个问题的一个解。我们用这样的步骤去尝试:
    1、先在第一排摆放一个皇后
    2、再在第二排找到一个可以摆放皇后的位置
    3、如此方法一直摆到最后一排。(当然,如果顺利的话)
    4、如果发现没有合适的位置,摆放下一个皇后,我们就调整之前的一个皇后的位置,再尝试摆下一个。如果依然无法找到,就多往回调整一个。
    通过这样的过程,我们一定可以找到所有的八皇后的摆放位置。

    为什么要考这个问题

    是的,八皇后问题已经基本作为大学教递归的必学问题出现了。会做这个问题可以被视为一个基本素质,那么面试的时候使用这个问题面试官到底想知道什么呢?

    1. 知道这个问题的解,在一定程度上说明基础知识覆盖到了这个面。当然了,还要看你是背的答案还是能解决这个类问题,这也是面试过程中的重点之一。
    2. 递归思想的掌握。在我们上面的解题描述中,其实并没有提到“递归”这个概念。但是,实际上是,第二个皇后的摆放是在第一个皇后摆好的基础上完成的,以此类推,第八个皇后的摆放是在第七个皇后摆好的基础上完成的。也就是我们在解题的过程中,只需要关注摆放好下一个皇后,以及什么时候是得到了一个解。
    3. 总结问题中的本质或者说规律。这是算法面试题的统一问题,但是规律千千万,被隐藏在各种表象之下。我们作为工程师,就是要实现本质,解决表象问题。

    如何把这个代码写出来
    八皇后的问题描述虽然看上去规则明确,但是,如果直接写代码的话我们会发现无从下手。这是因为我们需要将问题转化为数学问题,才能使用代码来解决。这也永远是一个问题使用计算机程序解决的最关键的第一步。
    转化为数学问题

    • 一个88的棋盘,我们可以使用一个长度为88的二维数组表示。
  • 相关阅读:
    贪心,队列,运算符重载,牛客:连环爆炸
    测试一下 Baichuan2-7B-Chat 的性能
    DASCTF X GFCTF 2022十月挑战赛web
    JSP pagecontext对象的简介说明
    国联易安:网络反不正当竞争,要防患于未然
    汽车虚拟仿真视频数据理解--CLIP模型原理
    Python识别图片的文字(Tesseract)和中文分词(jieba)
    python lambda表达式的用法
    06-kafka及异步通知文章上下架
    Jquery会议室布局含门入口和投影位置调整,并自动截图
  • 原文地址:https://blog.csdn.net/linghuanxu/article/details/133848872