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

server/2025/3/20 3:24:46/

一.题目

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

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

代码如下:

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);elseSystem.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.一开始的逻辑思考方向有问题,题目只给了约束条件,应该从约束条件进行思考,而非落子规律


http://www.ppmy.cn/server/176408.html

相关文章

【数据分享】2000—2024年我国省市县三级逐年归一化植被指数(NDVI)数据(年最大值/Shp/Excel格式)

之前我们分享过2000-2024年我国逐年的归一化植被指数&#xff08;NDVI&#xff09;栅格数据&#xff0c;该逐年数据是取的当年月归一化植被指数&#xff08;NDVI&#xff09;的年最大值。&#xff08;可查看之前的文章获悉详情&#xff09;&#xff01;该数据来源于NASA定期发布…

【第九节】windows sdk编程:通用控件的使用

目录 引言 一、通用控件简介 二、 WM_NOTIFY 消息 三、通用控件的使用 3.1 进度条 3.2 滑块 3.3 ListControl 引言 通用控件是Windows操作系统扩展的一组功能丰富的界面元素&#xff0c;广泛应用于各类应用程序中。它们不仅简化了用户界面的开发&#xff0c;还提供了强大…

HiPixel开源AI驱动的图像超分辨率的原生macOS 应用程序,使用 SwiftUI 构建并利用 Upscayl 强大的 AI 模型

一、软件介绍 文末提供程序和源码下载 HiPixel是一个开源程序基于SwiftUI构建的macOS原生应用程序&#xff0c;用于AI驱动的图像超分辨率&#xff0c;并利用Upscayl的强大AI模型。 二、软件特征 具有 SwiftUI 界面的原生 macOS 应用程序使用 AI 模型进行高质量图像放大通过 G…

HW基本的sql流量分析和wireshark 的基本使用

前言 HW初级的主要任务就是看监控&#xff08;流量&#xff09; 这个时候就需要我们 了解各种漏洞流量数据包的信息 还有就是我们守护的是内网环境 所以很多的攻击都是 sql注入 和 webshell上传 &#xff08;我们不管对面是怎么拿到网站的最高权限的 我们是需要指出它是…

Flume详解——介绍、部署与使用

1. Flume 简介 Apache Flume 是一个专门用于高效地 收集、聚合、传输 大量日志数据的 分布式、可靠 的系统。它特别擅长将数据从各种数据源&#xff08;如日志文件、消息队列等&#xff09;传输到 HDFS、HBase、Kafka 等大数据存储系统。 特点&#xff1a; 可扩展&#xff1…

docker安装node部分问题

sudo n latest sudo: n: command not found 如果运行 sudo n latest 时出现&#xff1a; sudo: n: command not found 说明 n 版本管理工具 未安装 或 未添加到 PATH 环境变量。 &#x1f6e0; 解决方案 1️⃣ 先检查 n 是否已安装 运行&#xff1a; which n或者&#xff1…

Redis如何实现持久化

Redis如何实现持久化 Redis默认将所有数据存储在内存中&#xff0c;虽然读写效率极高&#xff0c;但存在两大风险 数据易失性&#xff1a;进程重启或服务器宕机导致内存数据丢失。恢复成本高&#xff1a;无法直接通过内存重建大规模数据集。 Redis作为高性能的键值数据库&…

高频SQL 50 题(持续更新)

SQL的编写与运用 0. 写在前面 最近学习了数据库系统概论&#xff0c;其中涉及到了关于SQL语句的编写&#xff0c;感觉理论知识不足以让我掌握相关的编写方式&#xff0c;因此选择刷力扣上的题目进行复习巩固。 时间不是很多&#xff0c;可能不会经常更新&#xff0c;有时间写…