【蓝桥杯集训12】DFS(3 / 5)

news2025/1/16 20:16:08

目录

842. 排列数字 - DFS按位置枚举

843. n-皇后问题 - DFS按行枚举

165. 小猫爬山 - DFS枚举小猫

1209. 带分数 - DFS

3502. 不同路径数 - 


842. 排列数字 - DFS按位置枚举

活动 - AcWing

题目:

给你一个整数n

要求将1~n的所有排列情况列出

比如:n=3

则123 132 213 231……

思路:

dfs从0位置开始枚举 层层深入 每枚举完一种情况就回溯

/*
    *道阻且长,行则将至*
    author:Roye_ack
*/
import java.util.*;
import java.io.*;
import java.math.*;
 
class Main
{
    static PrintWriter wt=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    static int N=100010;
    static int[] st=new int[N];
    static int[] path=new int[N];
    static int n;
    
    static void dfs(int u) //枚举每一个位置
    {
        if(u==n) //位置从0 1 2……开始 如果u==n说明位置已经填满 需要输出
        {
            for(int i=0;i<n;i++) wt.print(path[i]+" ");
            wt.println();
        }
        for(int i=1;i<=n;i++)
            if(st[i]==0)
            {
                path[u]=i;
                st[i]=1;
                dfs(u+1);
                st[i]=0; //还原现场
            }
    }
    
    public static void main(String[] args) throws IOException
    {
        n=rd.nextInt();
        dfs(0);
        wt.flush();
    }
    
    static class rd
    {
        static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        static StringTokenizer tk=new StringTokenizer("");
        
        static String nextLine() throws IOException
        {
            return bf.readLine();
        }
        
        static String next() throws IOException
        {
            while(!tk.hasMoreTokens()) tk=new StringTokenizer(bf.readLine());
            return tk.nextToken();
        }
        
        static int nextInt() throws IOException
        {
            return Integer.parseInt(next());
        }
        
        static double nextDouble() throws IOException
        {
            return Double.parseDouble(next());
        }
        
        static long nextLong() throws IOException
        {
            return Long.parseLong(next());
        }
        
        static BigInteger nextBig() throws IOException
        {
            BigInteger d=new BigInteger(rd.nextLine());
            return d;
        }
    }
}

class PII
{
    int x,y;
    PII(int x,int y)
    {
        this.x=x;
        this.y=y;
    }
}

 

843. n-皇后问题 - DFS按行枚举

活动 - AcWing

题目:

n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上

现在给定整数 n,请你输出所有的满足条件的棋子摆法

思路:

这题思路和排列的dfs思路如出一辙

从第0行开始按行枚举,这样保证每一行只有一个棋子

  • 在某行情况下枚举每一列,如果该列、主对角线、副对角线上均没有棋子
  • 则把棋子放在该位置,递归这种情况下 下一行的棋子摆放位置
  • 当枚举行数==n时,因为是从第0行开始枚举,说明一个棋盘的棋子已经摆好
  • 则输出这种情况,然后回溯还原现场,继续输出下一种情况
  • 不断回溯递归,直到输出所有情况

 

对于主对角线和副对角线的标记

我们可以通过dg[x+y]  udg[y-x+n]映射得到

/*
    *道阻且长,行则将至*
    author:Roye_ack
*/
import java.util.*;
import java.io.*;
import java.math.*;
 
class Main
{
    static PrintWriter wt=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    static int N=20;
    static int[] col=new int[N],dg=new int[N],udg=new int[N];
    static char[][] g=new char[N][N];
    static int n;
    
    static void dfs(int u) //枚举每一个位置
    {
        if(u==n) //从0 1 2……行开始枚举 如果u==n说明棋盘已经摆满 需要输出
        {
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                    wt.print(g[i][j]);
                wt.println();
            }
            wt.println();
            return;
        }
        for(int i=0;i<n;i++)
            if(col[i]==0&&dg[i+u]==0&&udg[i-u+n]==0)
            {
                g[u][i]='Q';
                col[i]=dg[i+u]=udg[i-u+n]=1;
                dfs(u+1);
                col[i]=dg[i+u]=udg[i-u+n]=0;
                g[u][i]='.';
            }
    }
    
    public static void main(String[] args) throws IOException
    {
        n=rd.nextInt();
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++) g[i][j]='.';
        dfs(0);
        wt.flush();
    }
    
    static class rd
    {
        static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        static StringTokenizer tk=new StringTokenizer("");
        
        static String nextLine() throws IOException
        {
            return bf.readLine();
        }
        
        static String next() throws IOException
        {
            while(!tk.hasMoreTokens()) tk=new StringTokenizer(bf.readLine());
            return tk.nextToken();
        }
        
        static int nextInt() throws IOException
        {
            return Integer.parseInt(next());
        }
        
        static double nextDouble() throws IOException
        {
            return Double.parseDouble(next());
        }
        
        static long nextLong() throws IOException
        {
            return Long.parseLong(next());
        }
        
        static BigInteger nextBig() throws IOException
        {
            BigInteger d=new BigInteger(rd.nextLine());
            return d;
        }
    }
}

class PII
{
    int x,y;
    PII(int x,int y)
    {
        this.x=x;
        this.y=y;
    }
}

165. 小猫爬山 - DFS枚举小猫

活动 - AcWing

题目:

一共n只小猫,每只小猫重wi

一辆缆车最大承重为m

问最少雇多少辆车能把所有猫都装上?

思路:

总思路就是枚举所有情况的车数,取最小值

从第0只小猫开始枚举,dfs(小猫数,当前车数)

每次塞猫分两种情况:

  • 在已开好的车内,如果塞的下,塞进去,并递归这种情况下其他情况
  • 开好的所有车都装不下,则开新车,车数+1,并递归这种情况下的其他情况

因为要枚举所有情况,所以每次递归完后,回溯时要还原现场

当所有小猫枚举完后,更新最小的车数

优化点1:想要车越少,则先让重的猫上车,这样不会遇到塞不下多开新车,能优化搜索速度

优化点2:如果搜索到的答案 ≥ 目前的res 则不用继续搜索,因为再搜索也不是最优解

/*
    *道阻且长,行则将至*
    author:Roye_ack
*/
import java.util.*;
import java.io.*;
import java.math.*;
 
class Main
{
    static PrintWriter wt=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    static int N=20;
    static int[] a=new int[N],car=new int[N];
    static int n,w;
    static int res=N;
    
    public static void dfs(int cat,int bus)
    {
        if(bus>=res) return;
        
        if(cat==n)
        {
            res=Math.min(res,bus);
            return;
        }
        
        for(int i=0;i<bus;i++) //如果当前车可以塞的下
            if(car[i]+a[cat]<=w)
            {
                car[i]+=a[cat];
                dfs(cat+1,bus);
                car[i]-=a[cat];
            }
        //如果所有开好的车都塞不下 则开新车
        car[bus]=a[cat];
        dfs(cat+1,bus+1);
        car[bus]=0;
    }
    
    public static void main(String[] args) throws IOException
    {
        n=rd.nextInt();
        w=rd.nextInt();
        for(int i=0;i<n;i++) a[i]=rd.nextInt();
        Arrays.sort(a,0,n);
        for(int i=0,j=n-1;i<j;i++,j--)
        {
            int t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
        dfs(0,0); //dfs(小猫数,车数) 小猫和车都从0开始枚举
        wt.print(res);
        wt.flush();
    }
    
    static class rd
    {
        static BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
        static StringTokenizer tk=new StringTokenizer("");
        
        static String nextLine() throws IOException
        {
            return bf.readLine();
        }
        
        static String next() throws IOException
        {
            while(!tk.hasMoreTokens()) tk=new StringTokenizer(bf.readLine());
            return tk.nextToken();
        }
        
        static int nextInt() throws IOException
        {
            return Integer.parseInt(next());
        }
        
        static double nextDouble() throws IOException
        {
            return Double.parseDouble(next());
        }
        
        static long nextLong() throws IOException
        {
            return Long.parseLong(next());
        }
        
        static BigInteger nextBig() throws IOException
        {
            BigInteger d=new BigInteger(rd.nextLine());
            return d;
        }
    }
}
 
class PII
{
    int x,y;
    PII(int x,int y)
    {
        this.x=x;
        this.y=y;
    }
}

 

1209. 带分数 - DFS

活动 - AcWing

题目:

思路:

 

 

3502. 不同路径数 - 

3502. 不同路径数 - AcWing题库

题目:

思路:

 

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

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

相关文章

stm32hal库硬件IIC使用OLED(SSD1306)

其实OLED算是非常常用的一个小模块了&#xff0c;之前用的一直用的是软件模拟的IIC&#xff0c;总的来说感觉还是都是有点"答辩"&#xff0c;经常莫名其妙的就点不亮的&#xff0c;用了cubemx之后硬件iic配置就非常方便了&#xff0c;还是想用硬件iic&#xff0c;一方…

C++ 常用命令行开发工具(Linux)

文章目录1、简介2、gcc / g2.1 system&#xff08;执行shell 命令&#xff09;2.2 popen&#xff08;建立管道I/O&#xff09;2.3 vforkexec&#xff08;新建子进程&#xff09;3、clang3.1 下载和安装clang3.2 clang和gcc比较3.2.1 gcc3.2.2 clang3.2.3 LLVM4、make4.1 例子14…

DNS作用及工作原理

文章目录1. DNS作用2 DNS 三个组成部分&#xff1a;2.1 客户端2.2Local DNS2.3 权威域 DNS 服务器3 工作过程1. DNS作用 DNS 分为 Client 和 Server&#xff0c;Client 扮演发问的角色&#xff0c;也就是问 Server 一个 Domain Name&#xff0c;而 Server 必须要回答此 Domain…

MySQL实战解析底层---深入浅出索引

目录 前言 索引的常见模型 InnoDB 的索引模型 索引维护 后言 覆盖索引 最左前缀原则 索引下推 前言 一句话简单来说&#xff0c;索引的出现其实就是为了提高数据查询的效率&#xff0c;就像书的目录一样一本500 页的书&#xff0c;如果你想快速找到其中的某一个知识点&…

CentOS安装RStudio-Server的方法

R语言是生信分析、数据挖掘最常用最好用的软件之一&#xff0c;得到了广大生信工程师、数据分析师的厚爱。Rstudio 是 R 的集成开发环境&#xff0c;使得R语言的用户体验更强。一般个人电脑&#xff08;PC, Personal Computer&#xff09;使用单机版的 Rstudio 即可&#xff0c…

I.MX6ULL_Linux_系统篇(22) kernel移植

原厂 Linux 内核编译 NXP 提供的 Linux 源码肯定是可以在自己的 I.MX6ULL EVK 开发板上运行下去的&#xff0c;所以我们肯定是以 I.MX6ULL EVK 开发板为参考&#xff0c;然后将 Linux 内核移植到 I.MX6U-ALPHA 开发板上的。 配置编译 Linux 内核 和uboot一样&#xff0c;在编…

C#/Unity------抽象类与接口(一篇文章彻底搞懂...)

抽象类/接口以及区别 SUMMARY: 具体类→抽象类→接口&#xff1a;越来越抽象&#xff0c;内部实现的东西越来越少 一、抽象类 抽象类是未完全实现逻辑的类 抽象类为复用而生&#xff0c;专门用作基类 封装确定的&#xff0c;开放不确定的&#xff0c;推迟到合适的子类来实现…

初识STM32单片机

目录 初识STM32单片机 什么是单片机&#xff1f; STM系列单片机命名规则 STM32F103C8T6单片机简介 标准库与HAL库区别 通用输入输出端口GPIO 什么是GPIO&#xff1f; 定义 命名规则 内部框架图 推挽输出与开漏输出 如何点亮一颗LED灯 编程实现点灯 按键点亮LED灯…

【JavaWeb】CSS基础知识:引入方式 + 选择器

目录 CSS引入 行内样式表 内部样式表 外部样式表 CSS选择器 基础选择器 标签选择器 类选择器 ID选择器 通配符选择器 复合选择器 后代选择器 子选择器 CSS引入 CSS的引入有三种&#xff0c;三种的优缺点各不相同。 行内样式表 <!-- 行内样式表 --><!--…

Splunk Add-on 碰到证书SSL问题

最近Splunk add-on 在连接对方app 的 时候,经常报SSL的错: ERROR AdminManagerExternal - Unexpected error "<class requests.exceptions.SSLError>" from python handler: "HTTPSConnectionPool(host=app.com, port=443): Max retries exceeded with…

flex布局方式让最后一个(或第二个...n)元素居右显示

<div class"round"> <div class"income">收入</div> <div class"center"> <img style"width: 12px" src"../../img/big/up.png"> </div> <div class"rg"> <span cl…

项目实战典型案例1——redis只管存不管删除 让失效时间删除的问题

redis只管存不管删除 让失效时间删除的问题一&#xff1a;背景介绍二&#xff1a;思路&方案三&#xff1a;代码模拟1.错误示范通过班级id查询课程名称执行结果通过班级id修改课程名称&#xff08;并没有删除对应缓存&#xff09;执行结果2.正确示范在错误示范的更新接口上添…

详解进程 及 探查进程

进程的概念PCB是什么task_struct的作用如何执行进程进程的探查什么是bashps命令的使用&#xff08;查看进程&#xff09;创建进程探究父子进程进程的概念 简而言之&#xff0c;进程就是正在在执行的程序 之前说过&#xff0c;程序执行的第一步Windows是双击程序Linux是 ./ &a…

vue路由篇

路由的理解 介绍 路由(英文&#xff1a;route)就是对应关系&#xff0c; 路由分为前端路由和后端路由&#xff0c;比如前端路由就是 Hash 地址与组件之间的对应关系。 具体来说&#xff1a;一个路由就是一组key-value的对应关系 key 为 url 路径value 可能是函数function 或…

反弹shell数据不回显带外查询pikaqiu靶场搭建

P1 文件上传下载&#xff08;解决无图形化和解决数据传输&#xff09; 解决无图形化&#xff1a; 当我们想下载一个文件时&#xff0c;通常是通过浏览器的一个链接直接访问网站点击下载的&#xff0c;但是在实际的安全测试中&#xff0c;我们获取的权限只是一个执行命令的窗口…

Flink 提交模式

Flink的部署方式有很多,支持Local,Standalone,Yarn,Docker,Kubernetes模式等。而根据Flink job的提交模式,又可以分为三种模式: 模式1:Application Mode Flink提交的程序,被当做集群内部Application,不再需要Client端做繁重的准备工作。(例如执行main函数,生成JobG…

sizeof以及strlen的用法以及注意事项

大家都知道&#xff0c;在c中算字符串长度和所占空间大小事不可避免的&#xff0c;甚至再有的时候&#xff0c;我们在写代码的过程中&#xff0c;就会用到这些数据。比如&#xff0c;下面这道题 struct Test { int Num; char *pcName; short sDate; char cha[2]; short sBa[4];…

Git常用命令复习笔记

1. Git与SVN区别&#xff0c;各自优缺点 Git&#xff1a; 分布式&#xff0c;每个参与开发的人的电脑上都有一个完整的仓库&#xff0c;不担心硬盘出问题&#xff1b;在不联网的情况下&#xff0c;照样可以提交到本地仓库&#xff0c;可以查看以往的所有log&#xff0c;等到有…

数据结构刷题(十七):530二叉搜索树最小绝对差、501二叉搜索树中的众数、236二叉树的最近公共祖先、235二叉搜索树的最近公共祖先

一、二叉搜索树的最小绝对差题目链接思路&#xff1a; 中序遍历保留为list for循环找最小绝对差二叉搜索树中序遍历后是有序的数组&#xff01;&#xff01;注意&#xff1a;i 1开始遍历解法&#xff1a;public int getMinimumDifference(TreeNode root) {List<Integer>…

【C++升级之路】第八篇:string类

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【C学习与应用】 ✒️✒️本篇内容&#xff1a;简单介绍string类的概念、string类的常用接口、string类的模拟实现&#xff08;各个常见接口的实现代码&…