N皇后问题(DFS-深度优先算法)
N皇后问题(DFS-深度优先算法)
题目描述:
在 N×N 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意 22 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45° 的斜线上。你的任务是,对于给定的 N,求出有多少种合法的放置方法。
输入描述:
输入中有一个正整数 N<=10,表示棋盘和皇后的数量
输出描述:
为一个正整数,表示对应输入行的皇后的不同放置数量。
输入输出样例:
示例:
输入:
5
输出:
10
运行限制:
    最大运行时间:1s
    最大运行内存: 256M
解题思路
- 设置当前行为第一行,当前列为第一列,从第一行第一列(1,1)开始搜索,也就是说皇后只能从第一行放到第N行,我们也就不用再考虑同一行的问题,只需要去判断同一列和同一斜线的问题。
 - 利用数组进行存储,如:x[a] = i,就表示第a个皇后在第a行的第i列(即不用考虑同一行的问题);
 - 同一列的判断: 只需要判断其行数和列数是否相等,即 x[a] != x[i]
 - 同一斜线的判断: 只需要判断其 
行之差!=列之差即可 - 进行搜索: 当搜索到N+1行的时候,就表示第N行已经搜索完成,就将记录进行 +1 处理
 - 若在当前位置上不满足条件就进行回溯
 
JAVA语言:
import java.util.Scanner;
import static java.lang.Math.abs;
public class Main {
    static int x[] = new int[15];
    static int sum, n;
    static boolean PD(int k) {
        for (int i = 1; i < k; i++) {
            if (abs(k - i) == abs(x[k] - x[i]))
                return false;
            else if (x[k] == x[i])
                return false;
            //即判断是否符合条件来放,i表示皇后所在的行数,x[i]表示所在的列数,
            //所以前面那个条件用来判断两个皇后是否在对角线上,后面用来判断是否在同一列上。
            //行数不需要判断,因为他们本身的i就代表的是行数
        }
        return true;
    }
    static boolean check(int a) {
        if (a > n)
            sum++;
        else
            return false;
        return true;
    }
    static void DFS(int a) {
        if (check(a))
            return;
        else
            for (int i = 1; i <= n; i++) {
                x[a] = i;
                //第a个皇后放的列数
                if (PD(a))
                    //判断是否能放这步
                    DFS(a + 1);
                    //能的话进行下一个皇后的放置
                else continue;
                //不能就下一列
            }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        //表示几个皇后
        DFS(1);
        //每次都从第一个皇后开始
        System.out.println(sum);
    }
}
												
											N皇后问题(DFS-深度优先算法)的更多相关文章
- DFS深度优先算法学习
		
刚开始学习算法,参考大佬博客还是有很多不明白的,于是一步步解析,写下笔记记录. 大佬博客地址: https://blog.csdn.net/fuzekun/article/details/852204 ...
 - 广度优先算法(BFS)与深度优先算法(DFS)
		
一.广度优先算法BFS(Breadth First Search) 基本实现思想 (1)顶点v入队列. (2)当队列非空时则继续执行,否则算法结束. (3)出队列取得队头顶点v: (4)查找顶点v的所 ...
 - 回溯算法 DFS深度优先搜索 (递归与非递归实现)
		
回溯法是一种选优搜索法(试探法),被称为通用的解题方法,这种方法适用于解一些组合数相当大的问题.通过剪枝(约束+限界)可以大幅减少解决问题的计算量(搜索量). 基本思想 将n元问题P的状态空间E表示成 ...
 - [算法总结]DFS(深度优先搜索)
		
目录 一.关于DFS 1. 什么是DFS 2. DFS的搜索方式 二.DFS的具体实现 三.剪枝 1. 顺序性剪枝 2. 重复性剪枝 3. 可行性剪枝 4. 最优性剪枝 5. 记忆化剪枝 四.练习 一 ...
 - [ACM训练] 算法初级 之 搜索算法 之 深度优先算法DFS (POJ 2251+2488+3083+3009+1321)
		
对于深度优先算法,第一个直观的想法是只要是要求输出最短情况的详细步骤的题目基本上都要使用深度优先来解决.比较常见的题目类型比如寻路等,可以结合相关的经典算法进行分析. 常用步骤: 第一道题目:Dung ...
 - Java与算法之(5) - 老鼠走迷宫(深度优先算法)
		
小老鼠走进了格子迷宫,如何能绕过猫并以最短的路线吃到奶酪呢? 注意只能上下左右移动,不能斜着移动. 在解决迷宫问题上,深度优先算法的思路是沿着一条路一直走,遇到障碍或走出边界再返回尝试别的路径. 首先 ...
 - (原创)不过如此的 DFS 深度优先遍历
		
DFS 深度优先遍历 DFS算法用于遍历图结构,旨在遍历每一个结点,顾名思义,这种方法把遍历的重点放在深度上,什么意思呢?就是在访问过的结点做标记的前提下,一条路走到天黑,我们都知道当每一个结点都有很 ...
 - 在图中寻找最短路径-----深度优先算法C++实现
		
求从图中的任意一点(起点)到另一点(终点)的最短路径,最短距离: 图中有数字的点表示为图中的不同海拔的高地,不能通过:没有数字的点表示海拔为0,为平地可以通过: 这个是典型的求图中两点的最短路径:本例 ...
 - c++ 深度优先算法
		
#include <iostream> using namespace std; #define VertexNum 9 /*定义顶点数*/ struct Node /*声明图形顶点结构* ...
 - HDU 1241 Oil Deposits DFS(深度优先搜索) 和 BFS(广度优先搜索)
		
Oil Deposits Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
 
随机推荐
- CSS & JS Effect – Image 倒影框
			
效果 Step1: HTML 结构 <div class="image"> <img src="./images/img-2.png" /&g ...
 - SQL Server CTE (Common Table Expression) 公用表表达式
			
参考: Sql - CTE公用表表达式和With用法总结 YouTube – SQL WITH Clause | How to write SQL Queries using WITH Clause ...
 - ASP.NET Core – MVC vs Razor Page
			
前言 早年只有 MVC, Razor Page 是后来才出现的. 一开始其实我很看不起 Razor Page, MVC 能做的东西为什么要搞多一个 Razor Page 来做呢? 但我还是尝试用了起来 ...
 - Clickhouse-insert 数据写入不成功问题
			
[应用场景] 对副本表进行 alter delete 数据后,同样的数据再进行 insert into 操作. [问题复现] [问题解释] 对副本表 insert 语句的数据会划分为数据块. 每个数据 ...
 - [OI] 数学与推论证明 3(高中数学篇)
			
1 \[\color{#40865d}(2) \] \(f(x)=x^{2}-a(x+a\ln x)(a\neq0)\),若 \(f(1)+f'(1)=0\) 且 \(a\gt 0\),问可以得到什么 ...
 - 【赵渝强老师】Redis的RDB持久化
			
Redis 提供了多种不同级别的持久化方式: RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF (Append-only file) ...
 - 如何关闭每次打开启动软件前的弹窗(用户账户控制)你要允许此应用.WIN11、10、7
			
1.先点击任务栏内的搜索,输入"控制面板",然后点开 2.然后在右上角输入"更改用户",然后在下方点击"更改用户账户控制设置" 3.然后把& ...
 - 4.3 等比数列及其前n项和
			
\(\mathbf{{\large {\color{Red} {欢迎到学科网下载资料学习}} } }\)[[高分突破系列] 高二数学下学期同步知识点剖析精品讲义! \(\mathbf{{\large ...
 - 如何在kubernetes环境中共享GPU
			
随着人工智能和大模型的快速发展,云上GPU资源共享变得必要,因为它可以降低硬件成本,提升资源利用效率,并满足模型训练和推理对大规模并行计算的需求. 在kubernetes内置的资源调度功能中,GPU调 ...
 - 用sdkman管理多个jdk切换
			
前言 最近项目前后端进行升级,需要在jdk8和jdk17两个版本切换.最简单的是通过手动切换,但切换过程太繁琐,修改环境变量,达到切换目的.于是尝试其它解决方案,最终确实使用sdkman工具. sdk ...