N皇后问题——dfs解法(回溯+减枝+深搜)

递归 深搜 回溯练习 阅读详情

一.题目

这是一道很经典的题,首先分析一下题目,就是在棋盘上下棋,但是同一行,同一列,对角线上不能有棋子,否则无法落子,那这些信息也就是约束条件,模拟这些信息就是减枝函数的内容

既然它落子没有规律,只有位置有约束条件,那么我们就可以根据位置来考虑,不能同一行,同一列,同一对角线,那么我们就可以一行下一个,然后判断同一列,同一对角线是否有棋子,同理按其中三个随便一个约束条件来进行搜索,只需要满足其他两个约束条件就可以

代码如下:

public class Main {
    public static int sum = 0; 
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        if(n<=2)//首先把临界状况写出来
        {
          if(n==1)
            System.out.println(1);
          else
            System.out.println(0);
          return;
        }
        boolean[][] mark = new boolean[n][n];
        for(int i = 0;i<n;i++)//这里主要mark是数组,是引用类型变量,在方法中会对它的值进行改变,
//但是我们进行了回溯操作,每次调用完都会回到初始值,所以不用担心递归污染
        {
          dfs(0,i,mark,1);//这里在第一行已经落子,所以index初始值为1
        }
        System.out.println(sum);
        scan.close();
    }
    public static void dfs(int x,int y,boolean[][]mark,int index)
    {
      if(!cheak(x,y,mark))//不满足约束条件
        return;
      if(index == mark.length)//下够n个直接return
      {
        sum++;
        return;
      }
      mark[x][y] = true;
      for(int i = 0;i<mark.length;i++)
        dfs(x+1,i,mark,index+1);//x+1代表继续搜索下一行
      mark[x][y] = false;//回溯语句
    }
    public static boolean cheak(int x,int y,boolean[][]mark)//减枝函数
    {
      if(x<0||x>=mark.length||y<0||y>=mark.length)//是否在棋盘范围内
        return false;
      
      for(int i = 0;i<mark.length;i++)//是否在同一列
      {
        if(mark[i][y]==true)
          return false;
      }
      //是否在同一对角线
      for(int i = x,j = y;i>=0&&i<mark.length&&j>=0&&j<mark.length;i--,j--)
      {
        if(mark[i][j]==true)
          return false;
      }
      for(int i = x,j = y;i>=0&&i<mark.length&&j>=0&&j<mark.length;i--,j++)
      {
        if(mark[i][j]==true)
          return false;
      }
      //如果都满足就可以落子
      return true;
    }
}

本题犯错:

1.当n为1时判断错误,是有一种情况的,而非0种,思考不够全面

2.我们这里是对行进行搜索,在cheak里面应该对列进行判断,写成行了,粗心问题

3.本题其实还可以优化,懒得改了,测试用例全部通过

4.在主函数调用dfs时实际上第一行已经落子了,一开始将index写成0了,粗心问题

5.一开始的逻辑思考方向有问题,题目只给了约束条件,应该从约束条件进行思考,而非落子规律

蓝桥杯 基础练习 2n皇后问题(n皇后问题 回溯 dfs 递归) 问题描述   给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。 输入格式   输入的第一行为一个整数n,表示棋盘的大小。   接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个... 阅读详情

相关推荐

算法典型例题:N皇后问题,五种解法,逐步优化(递归版)

本文将介绍N皇后问题的五种解法,包括朴素回溯法、对称优化、标记优化、可用优化、位运算优化,对于每种解题思路,提供相应的递归版代码实现。

字节幺零二四的博客 1507

代码小技巧:剪枝(暴力出奇迹)

剪枝是在模型训练过程中使用的一种策略,其主要目的是降低模型的过拟合和提高模型的泛化能力,也可以用来优化模型的复杂度和算法的效率。剪枝是一种常用的优化技术,适用于各种机器学习算法中。本文将从剪枝的概念、类型和实现方式等方面对剪枝进行详细的介绍和解释,并探讨剪枝在机器学习中的应用。

Liuyuanxiao123的博客 1789

2N皇后问题-算法-C++

2n皇后问题(wustoj-1291)Description给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。如果你之前熟悉n皇后问题的解法,相信对于2n皇后问题也是很好理解的。如果对于n皇后问题还是不太清楚,那请...

qq_38063665的博客 7288

回溯法介绍

回溯法是一种系统地搜索问题解答的方法。在搜索的过程中尝试找到问题的解,如果发现找不到了,就退一步,往上回溯(剪枝过程)。对于许多复杂问题和大规模问题都可以使用回溯法。 回溯法的基本思想是按照深度优先搜索的策略,从根节点开始搜索,当到某个节点时要判断是否是包含问题的解,如果包含就从该节点继续搜索下去,如果不包含,就向父节点回溯。若用回溯法求问题的所有解时,要回溯到根,且根结点的所有可行的子树都要已被搜索遍才结束。而若使用回溯法求任一个解时,只要搜索到问题的一个解就可以结束。 回溯法常用的剪枝函数:(1)约束函

s13596191285的博客 2228

基于Simulink的直流电机双闭环调速系统抗扰动仿真与参数优化

本文详细介绍了基于Simulink的直流电机双闭环调速系统仿真与参数优化方法。通过构建转速外环与电流内环的仿真模型,阐述了利用工程设计法整定PI参数的核心步骤,并重点探讨了如何优化系统参数以增强其抗负载突变等扰动的能力,实现快速、平稳的调速性能。

weixin_29061997的博客 192

Unity中URP下的菲涅尔效果实现(个性化修改)

在上篇文章中,我们实现了 URP 下的菲涅尔基础效果,我们在这篇文章中,对其进行自定义化修改。

楠溪泽岸的博客 2063

剪枝算法(算法优化)

一:剪枝策略的寻找的方法 1)微观方法:从问题本身出发,发现剪枝条件 2)宏观方法:从整体出发,发现剪枝条件。 3)注意提高效率,这是关键,最重要的。 总之,剪枝策略,属于算法优化范畴;通常应用在DFS 和 BFS 搜索算法中;剪枝策略就是寻找过滤条件,提前减少不必要的搜索路径。 二:剪枝算法(算法优化) 1、简介     在搜索算法中优化中,剪枝,就是通过某种判断,避免一些

思緒凌亂 6万+

【UE5.3 Cesium for Unreal】GlobePawn编译实战:从源码修改到功能实现

本文详细介绍了在UE5.3中为Cesium for Unreal插件编译和集成非官方增强组件GlobePawn的完整实战流程。从获取源码、准备资产文件、部署项目结构,到逐行修改代码适配工程并解决典型编译错误,最终实现在三维地球上实现类似Google Earth的丝滑鼠标交互体验。

weixin_29011667的博客 307

八皇后-剪枝函数

剪枝原理:用三个一维数组分别记录当前列,左上到右下,右上到左下是否有皇后。 public class MyMain { public static int N=8; public static int lat[] = new int[N+60]; public static int lon[] = new int[N+60]; public static int cur[]=new in

u014660531的博客 1590

An example: 2D immersed boundary lattice Boltzmann method code--By Timm Krüger.2011.

//谢谢Timm Krüger大佬的代码。 还是老样子,有啥问题Feel free to tell us~毕竟群众力量大嘛~QQ群:293267908。 // 话不多说,上干货! // ISBN 978-3-319-44649-3 (Electronic) // 978-3-319-44647-9 (Print) // http://www.springer.c...

weixin_37783345的博客 1417

禅道二次开发(一):从零搭建本地开发与调试环境

本文详细介绍了禅道二次开发的第一步:从零搭建本地开发与调试环境。通过部署官方一键安装包、配置端口与防火墙、连接数据库、设置Samba文件共享,并最终在VSCode中配置PHP智能感知与Xdebug调试,手把手教你建立一个隔离、高效的专属开发工作台,为后续的代码修改与功能扩展奠定坚实基础。

weixin_29003437的博客 318

oj1001 BFS 剪枝函数

首先,该题很明显要使用递归来计算,为了是算法更有效,使用剪枝函数。 (1)若已剩的步数小于两点之间x的间距和y的间距之和,则不可能达到,该点可以减去。 (2)因为奇数点(x+y为奇数)到奇数点,偶数点到偶数点的步数为偶数,奇数到偶数的步数为奇数,则可以利用这个判断起点到终点是否可达。 import java.util.Scanner; public class Main_1010 { ...

suiyingsuiyi的博客 617

单像素成像技术原理与Matlab仿真实现

傅里叶变换是数字图像处理的核心数学工具,它将图像从空间域转换到频率域表示。基于傅里叶频谱分析的成像技术通过采集关键频率分量实现图像重建,这种原理催生了单像素成像这一创新技术。单像素成像利用空间光调制器和单个探测器直接测量傅里叶系数,结合压缩感知算法实现高效成像,在红外、太赫兹等特殊波段展现出独特优势。通过Matlab仿真可以验证傅里叶基测量矩阵的构建、压缩感知重建等关键技术环节,为实际系统开发提供理论基础。该技术在弱光环境成像、显微观测等领域具有重要应用价值,其低成本特性也大大降低了特殊波段成像的门槛。

weixin_29061425的博客 342

【算法】回溯:与递归,dfs的同质与分别,剪枝与恢复现场的详细理解,n皇后的回溯解法及算法复杂度分析。

本文先带大家了解什么是回溯:走不通回头,然后给出了第一个回溯算法的定义,然后给大家区分了递归和深度搜素和回溯的区别,然后引出了对回溯的剪枝和恢复现场的讲解,接着通过二叉树路径这道简单题目让大家对以上概念得到运用和更深入理解,最后使用递归解决了n皇后的问题,分析了时间复杂度和空间复杂度。创作不易,希望大家多多指教,如果觉得今天讲解的有学到东西,可以留下一个三连,持续关注后续的文章。

m0_71503225的博客 3337

大模型——AI对话四象限

{ "摘要": "文章揭示了90%的人不会有效与AI沟通的问题,指出简单粗暴的提问只能得到标准答案。作者提出'AI对话四象限'模型:1)双方都懂时提效;2)AI懂但需学会分层提问;3)共同探索未知领域;4)向AI传授独家知识。强调沟通技巧的重要性,认为会提问的人不会被AI替代。最后呼吁读者尝试四象限思维,与AI碰撞火花。" }

308

【Arduino 动手做】构建一个迷你 Las Vegas RGB LED 球体

《Arduino迷你拉斯维加斯球体项目:15岁少年的创意挑战》 15岁的Ben通过本项目展示了如何利用Arduino平台制作一个经济实惠的迷你拉斯维加斯球体夜灯。该项目涉及LED选择(采用WS2812B可编程灯带)、电子元件配置(含Arduino Nano微控制器和红外遥控)以及3D建模设计(100毫米直径球体)。项目难点包括LED布局优化、供电方案设计和3D打印外壳制作。Ben详细记录了从背景研究、电路设计到最终实现的完整过程,特别强调了分辨率与成本的平衡,以及如何通过白色扩散器改善视觉效果。这个项目不仅

雕爷学编程 1022

数据结构_dfs深度优先算法入门(C语言)

数据结构_dfs深度优先算法入门(C语言) 文章目录数据结构_dfs深度优先算法入门(C语言)0.闲话1.个人理解2.全排列问题(1到n的排列组合)2.八皇后问题求解二维迷宫(1)只输走出迷宫解的个数(2)输出解的个数和路径 0.闲话 ​ 才学习数据结构的dfs,做一下笔记记录一下,加深理解-.- ​ 我这里就简单讲一下我的理解和一下例子 ​ 推荐学习资源(B站视频,原理和实例): 洛谷 普及组...

qq_35289660的博客 5299

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

回溯法--n皇后问题

经典的n皇后问题 回溯法有两个模板--子集树、排列树,他们有回溯法的共同特点:深度优先搜索,如果一条路走不通,再退回来(类似递归)

m0_56147044的博客 5416

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++算法——DFS

DFS我们称之为深搜,通常解决一些最大最长或者所有可能的问题,一般用递归来实现。因为深搜基本上会遍历每一个结果,但暴力法不同在于,深搜可以通过递归中不满足条件,实现剪枝。 我们先来看一道例题,感受一下深搜。 思路其实比较简单,有点类似于穷举法。我们构建一棵数,每一层依次增加一个没有枚举的数,当到达底层的时候就是一个答案。 比如我们先将第一个数填1,然后由于还有数未填入,继续深入到达下一层。下一层由于第一个数1已经枚举,我们枚举第二个数2。然后继续进入第三层,枚举第三个数3,由于已经把所有的数都枚举完,我

MrChen666的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

DFS:深搜+回溯+剪枝实战解决OJ问题

一篇带你完全掌握DFS

Makise的博客 3518

LeetCode琅琊榜第十三层-全排列(DFS深度优先算法)

LeetCode.46全排列 难度:中等 博主空间与往期力扣 题目链接

算法萌新一枚 804

深入浅出深度优先搜索(DFS)——以经典N皇后问题为例

想象你面前有一张8∗88 * 88∗8的国际象棋棋盘,现在需要摆放888个皇后,使得任意两个皇后都无法互相攻击。这个看似简单的谜题,自184818481848年被提出以来吸引了无数数学家与计算机科学家的目光。当我们把棋盘扩展到N∗NN*NN∗N规格时,就诞生了著名的N皇后问题。本文将带您通过这个经典问题,深入理解深度优先搜索(DFS)这一重要的算法思想。深度优先搜索(Depth-First Search)采用"不撞南墙不回头"的策略,其运行过程就像探险者深入洞穴: 1.3 算法特性分析 时间复杂度:O(b

Lostgreen的博客 1277

算法沉淀——穷举、暴搜、深搜、回溯、剪枝综合练习三(leetcode真题剖析)

在检查皇后是否冲突时,可以使用一个数组来记录每一列是否已经放置了皇后,并检查当前要放置的皇后是否会和已经放置的皇后冲突。对于对角线,可以使用两个数组来记录从左上角到右下角的每一条对角线上是否已经放置了皇后,以及从右上角到左下角的每一条对角线上是否已经放置了皇后。通过深度优先搜索的方式,不断地枚举每个数在当前位置的可能性,并回溯到上一个状态,直到枚举完所有可能性,得到正确的结果。首先,在每一行放置第一个皇后,然后遍历棋盘的第二行,在可行的位置放置第二个皇后,再遍历第三行,以此类推,直到放置了n个皇后为止。

立志做一个高产且细节博主 1533

[算法]八皇后问题

每个格子有一一对应的行,列, (列,行),记作(x,y)试规定以左下角格子为(1,1)向右延伸为(1,2), (1,3),向下延伸为(2,1), (3,1)第可以理解为第y行第x列,那么对角线可以表示为主对角线x-y=0(下图绿线),则副对角线为 x+y = 9,还有一点,棋盘为八行八列,放置八皇后,若解,则表明,每列,每行均有皇后,我们考虑放置第x列的皇后,应该放置在行数,若该格点,并未被其他皇后攻击,则放置皇后,并标记各个变量,那么知道一点坐标,便可以标识该对角线上所有的点。:这时棋盘的大小变为。

qq_57916921的博客 1294

N皇后问题的排列树做法(递归&非递归)

回溯法,俗称暴力搜索。用排列树的方法的话实际上是枚举全排列,因为皇后不可能在同一列,因此列数不可能一样因此可以使用全排列的方式来做这道题目。

weixin_61704900的博客 1714

N皇后问题(DFS-深度优先算法)

状态搜索代表: N 皇后问题 在 N×N 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意 22 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45° 的斜线上。你的任务是,对于给定的 N,求出有多少种合法的放置方法。

m0_70521436的博客 539
上一篇: 蓝桥杯国赛—1022玩具蛇
下一篇: 蓝桥杯——车牌(dfs全排列问题)
Vaclee
博客等级 码龄3年 471粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值