#深搜DFS

news2024/9/28 1:19:42

深搜
数据结构: 栈 stack
空间: O(n)

框架
dfs{
	if(满足条件){
		按要求干活;
		return ;//回溯
	}
	for(枚举){
		if(找到没有被枚举过的点){
			按题目干活;
			记录这个点已被枚举;
			dfs(这个点);
			取消记录,恢复现场;(回溯)
		}	
	}

}



题1 :AcWing 842. 排列数字
#include<bits/stdc++.h>
using namespace std;
int n, p[10];
bool b[10];
void D (int u){

    if(u == n){
        for(int j = 0; j < n; j ++ )
            cout << p[j] << " ";
        cout << endl;
        return ;
    }

    for(int i = 1; i <= n; i ++)
        if( !b[i] ){
            b[i] = 1;
            p[u] = i;
            D(u + 1);
            b[i] = 0;
        }
    return ;
}
int main(){
    cin >> n;
    D(0);
    return 0;
}
/*
i 不可以放在 函数D 的外面定义!
*/


题2 : AcWing 843. n-皇后问题
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
int n, p[N];
char g[N][N];
bool col[N], dg[N], udg[N];
void D (int u){

    if(u == n){
        for(int j = 0; j < n; j ++ )
            puts(g[j]);
        cout << endl;
        return ;
    }

    for(int i = 0; i < n; i ++)
        if( !col[i] && !dg[u + i] && !udg[n - u + i] ){
            g[u][i] = 'Q';
            col[i] = dg[u + i] = udg[n - u + i] = 1;
            p[u] = i;
            D(u + 1);
            g[u][i] = '.';
            col[i] = dg[u + i] = udg[n - u + i] = 0;
        }
    return ;
}
int main(){
    cin >> n;
    for(int i = 0; i < n; i ++)
        for(int j = 0; j < n; j ++)
            g[i][j] = '.';
    D(0);
    return 0;
}
/*
*0 搜索方式 : 深搜。
    具体操作:先遍历 第0行 可以放皇后的所有位置,再遍历 第1行 可以放皇后的位置...依次类推到 第n行。

*1 
    补英文:column   列
            diagonal 对角线
            row      行
*2 这里 u+i  以及  n-u+i  分别是  (u,i)所在的对角线(这样的 /)  以及  反对角线(这样的 \)
    具体推导是: 令 (u, i) 为 在坐标轴上的 (x, y);
                (x, y)分别在对角线 y = x + b 以及 反对角线 y = -x + b 上。
                坐标轴上的 y=x+b  =>  b=x-y  =>  b=n+x-y  (防止出现负数) ;
                      以及  y=-x+b  =>  b=x+y 。

                这时的 b 就是 (u,i) 所在的 对角线(或反对角线)的唯一编号;
                这样下来,在同一对角线的所有点就有了一样的唯一编号。(具体多少不重要u, i 可调换)
*3 p[u] 表示第u 行放的皇后的位置。
*4 时间是 18ms 左右;
*/

/*
    *2点中说的对角线上的 u, i 调换对比版,答案是一样的。
    不用纠结 对角线和反对角线 这里的坐标序号之类的。
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
int n, p[N];
char g[N][N];
bool col[N], dg[N], udg[N];
void D (int u){

    if(u == n){
        for(int j = 0; j < n; j ++ )
            puts(g[j]);
        cout << endl;
        return ;
    }

    for(int i = 0; i < n; i ++)
        if( !col[i] && !dg[i + u] && !udg[n - i + u] ){
            g[u][i] = 'Q';
            col[i] = dg[i + u] = udg[n - i + u] = 1;
            p[u] = i;
            D(u + 1);
            g[u][i] = '.';
            col[i] = dg[i + u] = udg[n - i + u] = 0;
        }
    return ;
}
int main(){
    cin >> n;
    for(int i = 0; i < n; i ++)
        for(int j = 0; j < n; j ++)
            g[i][j] = '.';
    D(0);
    return 0;
}

*/
/*
原始的 “选与不选”搜索方法;
从(0,0) 一直依次遍历到 (n,n),对于每一个格子的操作是(放皇后或不放皇后);
时间是 107ms左右 ,不如上一个算法;
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
int n ;
char g[N][N];
bool col[N], dg[N], udg[N], row[N];
void D (int x, int y, int s){
    if(y == n){
        x ++;
        y = 0;
    }

    if(x == n){
        if(s == n){
            for(int i = 0; i < n; i ++)
                puts(g[i]);
                cout << endl;
        }
        return ;
    }

    D(x, y  + 1, s);

    if(!row[x] && !col[y] && !dg[n - x + y] && !udg[x + y]){
        row[x] = col[y] = dg[n - x + y] = udg[x + y] = 1;
        g[x][y] = 'Q';
        D(x, y + 1, s + 1);
        g[x][y] = '.';
        row[x] = col[y] = dg[n - x + y] = udg[x + y] = 0;
    }
}
int main(){
    cin >> n;
    for(int i = 0; i < n; i ++)
        for(int j = 0; j < n; j ++)
            g[i][j] = '.';
    D(0, 0, 0);
    return 0;
}
*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1035182.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

YOLOv3模型原理深度解析

概况 &#xff08;1&#xff09;YOLOv3是YOLO系列第一次引入残差连接来解决深度网络中的梯度消失问题&#xff08;是不是第一次&#xff0c;有待你后面考证&#xff09;&#xff0c;实际用的backbone是DarkNet53 &#xff08;2&#xff09;最显著的改进&#xff0c;也是对你涨…

[Linux]线程概念

[Linux]线程概念 文章目录 [Linux]线程概念什么是线程Linux系统下的线程实现线程是CPU调度的基本单位进程是系统分配资源的基本实体二级页表 线程的优点线程的缺点线程异常线程用途线程资源 什么是线程 线程是进程内部的一个执行分支&#xff0c;执行粒度比进程更细&#xff0…

MyBatis 中的插件可以拦截哪些操作

MyBatis 中的插件可以拦截哪些操作 MyBatis 是一个优秀的持久化框架&#xff0c;在实际项目开发中广泛应用。MyBatis 的插件机制可以方便地对 MyBatis 的各个环节进行扩展和定制。在本文中&#xff0c;我们将详细介绍 MyBatis 中的插件机制&#xff0c;并探讨插件可以拦截哪些…

十五、红外遥控器

十五、红外遥控器 介绍基本接收和发送遥控器键码外部中断和外部中断寄存器 红外解码中断函数红外遥控电机模块电机调速 介绍 基本接收和发送 空闲状态&#xff1a;红外LED不亮&#xff0c;接收头输出高电平发送低电平&#xff1a;红外LED以38KHz闪烁&#xff0c;接收头输出低…

深入理解requests库和使用方法

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; 一、requests简介 首先我们要了解requests库是个什么 #简介&#xff1a;使用requests可以模拟浏览器的…

10.3使用Servlet写一个表白墙网站

一.创建项目,引入依赖和前端页面. 1.注意,静态页面放在webapp目录下,不是WEB-INF, 2.存档约定:前端使用post(/messageWall/message)发送http请求,使用json格式把数据传输到后端.服务器返回HTTP/1.1 200 ok. 3.读档约定:使用get(/messageWall/message),服务器返回HTTP/1.1 200…

【C++入门指南】C如何过渡到C++?祖师爷究竟对C++做了什么?

【C入门指南】C如何过渡到C&#xff1f;祖师爷究竟对C做了什么&#xff1f; 前言一、命名空间1.1 命名空间的定义1.2 命名空间使用 二、C输入、输出2.1 std命名空间的使用惯例 三、缺省参数3.1 缺省参数的定义3.2 缺省参数分类 四、函数重载4.1 函数重载概念4.2 C支持函数重载的…

C++17中std::filesystem::path的使用

C17引入了std::filesystem库(文件系统库, filesystem library)。这里整理下std::filesystem::path的使用。 std::filesystem::path&#xff0c;文件系统路径&#xff0c;提供了对文件系统及其组件(例如路径、常规文件和目录)执行操作的工具。此path类主要用法包括&#x…

大众滑雪赛事活动等级划分与评定规范 学习

声明 本文是学习GB-T 42374-2023 大众滑雪赛事活动等级划分与评定规范. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件确立了大众滑雪赛事活动的等级划分规则&#xff0c;规定了总体要求、评定主体、申报条件、等级评定 要求、结果应…

Linux0.11——第二回 从0x7c00到0x90000

上一讲&#xff0c;讲了CPU执行操作系统的最开始的两行代码&#xff1a; mov ax, 0x07c0 mov ds, ax这两行代码将数据段寄存器 ds 的值变成了 0x07c0&#xff0c;方便之后访问内存时&#xff0c;利用这个段基址进行寻址。 接下来的代码&#xff1a; mov ax,0x9000 mov es,ax…

微服务学习(八):安装JDK

微服务学习&#xff08;八&#xff09;&#xff1a;安装JDK 1、下载JDK 2、将下载后的资源包上传到服务器 3、解压资源包并安装 tar -zxvf jdk-8u371-linux-x64.tar.gz4、配置环境变量 vi /etc/profileexport JAVA_HOME/home/java/jdk1.8.0_371/ export PATH$PATH:$JAVA_HOM…

关于ES5内置函数Object的新方法--Object.create()

在今天的学习中&#xff0c;更深层次的了解了一下ES5中内置函数Object的新方法Object.create(),觉得这个api功能真的十分强大&#xff0c;并且使用的场景也有很多&#xff0c;现和各位同行们分享学习成果&#xff0c;欢迎各位大佬们指正&#xff0c;废话不多说&#xff0c;开整…

git reset origin --hard解决‘Your branch is ahead of ‘origin/xxxx‘ by xx commit.’

git reset origin --hard解决‘Your branch is ahead of origin/xxxx by xx commit.’ 如图&#xff1a; 之前是这么解决的解决git&#xff1a;Your branch is ahead of ‘XXX‘ by X commits-CSDN博客git删除/撤销远已经push到程服务器上某次代码提交场景&#xff1a;不小心把…

InterSystems开发者社区中文版第二届技术征文大赛正式启动!

嗨&#xff0c;开发者们&#xff01; 秋高气爽之际&#xff0c;我们很高兴地宣布启动&#x1f3c6;InterSystems开发者社区中文版第二届技术征文大赛 &#x1f3c6;&#xff08;←点击链接进入参赛页面&#xff09;&#xff01; 从2023年9月19日-10月24日&#xff08;北京时间…

基于微服务的第二课堂管理系统(素质拓展学分管理平台)SpringCloud、SpringBoot 分布式,微服务

基于微服务的第二课堂管理系统 一款真正的企业级开发项目&#xff0c;采用标准的企业规范开发&#xff0c;有项目介绍视频和源码&#xff0c;需要学习的同学可以拿去学习&#xff0c;这是一款真正可以写在简历上的校招项目&#xff0c;能够真正学到东西的一个项目&#xff0c;话…

【论文写作】符号:矩阵、向量的乘法、内积、点积等

【论文写作】符号&#xff1a;矩阵、向量乘法、内积、点积等 文章目录 【论文写作】符号&#xff1a;矩阵、向量乘法、内积、点积等1. 矩阵乘法1.1 矩阵乘积1.2 矩阵哈德玛乘积1.3 矩阵克罗内克积 2. 向量乘法2.1 向量点积、内积2.2 向量Hadamard积2.3 向量外积2.4 向量叉积 1.…

科研之路(2023.9.22)

前言 理解小车底盘代码&#xff0c;为了轨道机器人研究 笔记

2023最新SRC漏洞挖掘快速上手攻略!(小白也能行,真的不试试吗?)

前言 随着网络安全的快速发展&#xff0c;黑客攻击的手段也越来越多样化&#xff0c;因此SRC漏洞挖掘作为一种新的网络安全技术&#xff0c;也在不断发展和完善。那么&#xff0c;作为一个网安小白如果想要入门SRC漏洞挖掘&#xff0c;需要掌握哪些知识呢&#xff1f;以下是本…

深入了解接口测试:方法、工具和关键考虑因素(一)

接口测试是软件测试中的一项重要工作&#xff0c;它涉及到系统与系统之间的交互点。接口可以是外部接口&#xff0c;也可以是内部接口&#xff0c;包括上层服务与下层服务接口以及同级接口。在接口测试中&#xff0c;我们需要确保接口能够按照预期的方式进行通信和交互&#xf…