蓝桥杯——搜索

搜索

DFS基础+回溯

回溯法简介:

回溯法一般使用DFS(深度优先搜索)实现,DFS是一种遍历或搜索图、树或图像等数据结构的算法,当然这个图、树未必要存储下来(隐式处理就是回溯法),常见的是通过某种关系构造出的搜索树,搜索树一般是排列型搜索树(总节点个数一般为n!级别)和子集型搜索树(总节点个数一般为2^n级别)。

排列型就是每次枚举选哪个,子集型就是对于每一个元素选或不选(结果与顺序无关)

DFS从起始节点开始,沿着一条路径尽可能深入地搜索(一条路走到黑),直到无法继续为止,然后回溯到前一个节点,继续探索其他路径,直到遍历完整个图或树。
DFS使用栈或递归来管理节点的遍历顺序,一般使用递归。
很多时候DFS和回溯法不必过度区分。

排列树

子集树


回溯法模板

这是一个排列型搜索树,实际上的回溯法比较灵活,需要根据题意要求来具体分析。
visll表示数字i是否使用过,也经常被用于表示某个元素是否使用过。
all存放结果,当dep深度=n + 1时说明n层都已经算完了,直接输出结果。
子集型搜索树模板结构类似,就是在往下走时候只有两条边,表示“选或不选当前这个元素”。

eg1——N皇后问题

 代码:

#include<bits/stdc++.h>
using namespace std;
int a[11][11];
int ans = 0; int n;
bool check(int deep,int m){
    for(int k = 0; k < n ; ++ k){
        if(a[k][m]) return false;
    }
    // 检查所有方向以判断皇后是否会攻击
    //下方还没有放置皇后,所以不用检查
    for(int i = 1; i <= deep; i++) {
        if(a[deep - i][m]) return false; // 检查上方
        if(m - i >= 0 && a[deep - i][m - i]) return false; // 检查左上方
        if(m + i < n && a[deep - i][m + i]) return false; // 检查右上方
    }
    return true;
}
void dfs(int deep){
    if(deep == n){
        ans++;
        return;
    }
    for(int i = 0; i < n ; ++ i){
        if(check(deep,i)){
            a[deep][i] = 1; // 放置皇后
            dfs(deep+1);
            a[deep][i] = 0; // 移除皇后
        }
    }
}
int main(){
    cin>>n;
    dfs(0);
    cout<<ans;
    return 0;
}    
eg2——小朋友的崇拜圈

#include<stdio.h>
int n;
int a[100001],v[100001];
int max=0;//定义全局变量,方便求最大值
int t;//暂时保存开始位置的小朋友的编号

void dfs(int x,int y)
{
  if(v[x])//只要访问过了已经访问的编号,就是有闭合的圈
  {
    if(a[x]==a[t])//只有满足这个条件,才符合一个真正意义上的圈
    {
      if(y>max)
        max=y;
    }
    return;
  }
  else
  {
    v[x]=1;
    dfs(a[x],y+1);
    v[x]=0;//每次进行一次dfs搜索,回溯,避免影响下一次的搜索
  }
}
int main()
{
  scanf("%d",&n);
  for(int i=1;i<=n;i++)
  scanf("%d",&a[i]);
  for(int i=1;i<=n;i++)//这个开始的编号要从1开始比较方便,因为每个人崇拜的小朋友的编号都是从下标为1开始的
  {
    t=i;//t暂时保存此时的为起点的小盆友的编号
    dfs(i,0);//每个小朋友都进行一次dfs搜索
  }
  printf("%d",max);
  return 0;
}
eg3——全球变暖

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e3 + 10, M = N * N;

char g[N][N];
int n, ans, vis[N][N];
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
bool flag = true;  // 假设被淹没

void has_submerge(int sx, int sy)
{
    vis[sx][sy] = 1;
    bool has_water = false;  // 假设周围没有水

    for(int i = 0; i < 4; i++)  // 遍历四个方向
    {
        int x = sx + dx[i], y = sy + dy[i];

        if(x < 0 || y < 0 || x >= n || y >= n) continue;

        if(vis[x][y] ) continue;

        if(g[x][y] == '.'){ has_water = true; continue;}

        vis[sx][sy] = 1;

        has_submerge(x, y);

    }
    if(!has_water) flag = false;  // 四个方向循环完再去更新flag 
}
int main()
{
    cin >> n;
    for(int i = 0; i < n; i++) cin >> g[i];

    for(int i = 0; i < n; i++)
        for(int j = 0; j < n; j++)
         if(g[i][j] == '#' && !vis[i][j])
         {
             flag = true;
             has_submerge(i, j);
             if(flag) ans ++;
         }

    cout << ans << endl;
    return 0;
}

 

 eg4——数字王国之军训排队

#include<bits/stdc++.h>
using namespace std;
const int N=15;
int n;
int a[N];
vector<int> vec[N];//二维vector这样定义,别用vector<vector<int>> vec,因为前者外部vector已声明大小,可以直接调用迭代器,后者不行 
bool dfs(int dep,int i)//dep为第几个学生,i为分几队 
{//dfs用于判断是否可以分为i队 
    if(dep==n+1) return true;//如果递归到了最底层,说明可以分成i队 

    for(int j=0;j<i;j++)//将当前dep学生分到j队 
    {    bool flag=false;
        for(const auto &b:vec[j]) //遍历二维vector,遍历vector用auto枚举比较方便, 
        {
        //这种题型与组合枚举不一样,不要用两条件来思考 
            if(a[dep]%b==0) //如果当前将要入队的数字学生与队里面的数字可以整除,即有倍数关系 
            {                 //因为用sort排过序,所以a[dep]一定比b大 
                flag=true;break;
            }
             
            
        }
        if(flag) continue;
        vec[j].push_back(a[dep]);
        if(dfs(dep+1,i)) return true;//不要写成return true,布尔dfs的递归这样写,若为false仍需执行后面的恢复现场语句 
        //恢复现场 
        vec[j].pop_back();
    }
    return false; //中间执行完后没有return true,则return false 
}
int main()
{ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
     for(int i=1;i<=n;i++)//将1到n队都试试 
     {
         if(dfs(1,i)) //第一个可行的队即为最少的队 
         {
             cout<<i;
             break;
         }
     }
    return 0;
}
eg5——特殊的三角形

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

075_基于springboot的万里学院摄影社团管理系统

目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍&#xff1a;CodeMentor毕业设计领航者、全网关注者30W群落&#xff0c;InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者&#xff0c;博客领航之星、开发者头条/腾讯云/AW…

jmeter中发送post请求遇到的问题

用jmeter发送post请求&#xff0c;把请求参数放在Body Data处&#xff0c;参数都写得正确&#xff0c;但没想到结果每次都报错&#xff0c;直接响应结果乱七八糟&#xff0c;改成用Parameters,反而不乱报错了。 上图 请求里如下 另外一些请求也是这样 这个响应结果也是错误的…

C语言指针,结构体

目录 指针 预备知识 指针变量 指针 预备知识 指针变量 指针数组 指针和多维数组 字符指针 结构体 引例 结构体定义 结构体数组 结构体指针

AI智能体:AI智能体(Agent)是什么?为什么要学?99%的人不知道!

为什么要学&#xff1f; 我们先搞清楚为什么&#xff1f; 最近看到 AI 创新力五问&#xff0c;我们日常生活中有使用 AI 来融入到我们的学习工作流嘛&#xff1f; 值得我们日常反省。 未来企业人才招聘测试AI创新力的五问&#xff1a; 您是否处于每天习惯使用 AI 的状态&am…

es索引库操作和使用RestHignLevelClient客户端操作es

目录 es索引库操作 mapping映射操作 索引库的CURD操作 1.创建索引库和映射 ​编辑 2.查询索引库 3.删除索引库 4.修改索引库 5.总结 文档的CURD操作 1.新增文档 2.查询文档 3.删除文档 4.修改文档 全量修改 增量修改 5.总结 RestAPI 使用API例子 需要的数…

【Android】Jetpack入门知识总结(LifeCycle,ViewModel,LiveData,DataBinding等)

文章目录 LifeCycle使用Lifecycle解耦页面与组件自定义控件实现LifecycleObserver接口注册生命周期监听器 使用LifecycleService解耦Service与组件使用ProcessLifecycleOwner监听应用程序生命周期 ViewModel用法在 Fragment 中使用 ViewModel LiveDataDataBinding导入依赖基本用…

构建后端为etcd的CoreDNS的容器集群(二)、下载最新的etcd容器镜像

在尝试获取etcd的容器的最新版本镜像时&#xff0c;使用latest作为tag取到的并非最新版本&#xff0c;本文尝试用实际最新版本的版本号进行pull&#xff0c;从而取到想的最新版etcd容器镜像。 一、用latest作为tag尝试下载最新etcd的镜像 1、下载镜像 [rootlocalhost opt]# …

找到连续赢 K 场比赛的第一位玩家

题目链接 找到连续赢 K 场比赛的第一位玩家 题目描述 注意 2 < n < 10^51 < skills[i] < 10^6skills 中的整数互不相同这个比赛的赢家是第一位连续赢下k场比赛的玩家 解答思路 双指针&#xff0c;一个指针maxIdx指向当前技能等级最高的玩家&#xff0c;另一个…

pagehelper 开启分页查询之后为什么total返回有误

场景重现 在controller中 使用了pageHelper 分页之后,巡查结果的确是10个,但是为什么total永远都是10?debug发现 没法获取到原本的total,获取的是list的长度热心网友的回答 网上的原因是:TableDataInfo(list)list的泛型是 T类型,但是Mapper中返回的List的泛型是M看了一…

想让前后端交互更轻松?alovajs了解一下?

作为一个前端开发者&#xff0c;我最近发现了一个超赞的请求库 alovajs&#xff0c;它真的让我眼前一亮&#xff01;说实话&#xff0c;我感觉自己找到了前端开发的新大陆。大家知道&#xff0c;在前端开发中&#xff0c;处理 Client-Server 交互一直是个老大难的问题&#xff…

如何提取视频文件中的音频(.mp4 to .mp3)

1.安装 FFmpeg&#xff08;windows 为例&#xff09; 官网地址 第一步 点击 windows 版 第二步 解压下载好的 .zip文件 第三步 解压之后进入 bin 目录下 第四步 点击导航栏 输入 cmd 回车 第五步 输入指令 ffmpeg -i input_video.mp4 -q:a 0 -map a output_audio.mp3将上面…

算法题总结(十六)—— 动态规划(上)

动态规划 动态规划理论基础 什么是动态规划 动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff…

实战 | 国外攻破大学数据库系统,暴露数千学生记录

实战 | 国外攻破大学数据库系统&#xff0c;暴露数千学生记录 引言 在这篇文章中&#xff0c;我将分享我是如何攻破一个大型大学解决方案门户服务器的&#xff0c;这个服务器服务于许多大学客户&#xff0c;并且涉及数千名学生的数据。 目标 这是一个由印度许多大学和学院使…

没有基础,学习HCIE难吗?

首先要清楚&#xff0c;华为 HCIE-Datacom 认证并非局限于特定专业背景&#xff0c;即便对专业基础有一定要求&#xff0c;无论你有无相关学习经历或者工作经验&#xff0c;皆有机会报考并争取通过这一认证。HCIE-Datacom 考试主要由笔试和实验两部分构成&#xff0c;涉及高级路…

elf加载,动态库加载

elf加载 ELF&#xff08;Executable and Linkable Format&#xff0c;可执行与可链接格。 所以我们写代码生成的可执行文件&#xff0c;以及写的动态库都是elf格式的文件。 我们重点要关注的就是红色框框里面的section节。 而节保存的就有我们的代码段和数据段。所以我们链接…

Redis 性能优化选择:Pika 的配置与使用详解

引言 在我们日常开发中 redis是我们开发业务场景中不可缺少的部分。Redis 凭借其内存存储和快速响应的特点&#xff0c;广泛应用于缓存、消息队列等各种业务场景。然而&#xff0c;随着数据量的不断增长&#xff0c;单节点的 Redis 因为内存限制和并发能力的局限&#xff0c;逐…

ONLYOFFICE文档8.2:开启无缝PDF协作

ONLYOFFICE 开源办公套件的最新版本新增约30个新功能&#xff0c;并修复了超过500处故障。 什么是 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器&#xff0c;支持编辑处理文档、表格、幻灯片、可填写的表单和PDF。可多人在线协作&#xff0c;支持插件和 AI 集…

论文解读 | ECCV2024 AutoEval-Video:一个用于评估大型视觉-语言模型在开放式视频问答中的自动基准测试...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者讲解回放&#xff01; 作者简介 陈修元&#xff0c;上海交通大学清源研究院硕士生 概述 总结来说&#xff0c;我们提出了一个新颖且具有挑战性的基准测试AutoEvalVideo&#xff0c;用于全…

红队-安全见闻篇(上)

声明 学习视频来自B站UP主 泷羽sec的个人空间-泷羽sec个人主页-哔哩哔哩视频,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 一.编程与开发 1.后端语言学习 C语⾔&#xff1a;⼀种通⽤的…

NVR小程序接入平台/设备EasyNVR多个NVR同时管理的高效解决方案

在当今的数字化安防时代&#xff0c;视频监控系统的需求日益复杂和多样化。为了满足不同场景下的监控需求&#xff0c;一种高效、灵活且兼容性强的安防视频监控平台——NVR批量管理软件/平台EasyNVR应运而生。本篇探讨这一融合所带来的创新与发展。 一、NVR监测软件/设备EasyNV…