C++:dfs,bfs各两则

1.木棒

167. 木棒 - AcWing题库

乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过 5050 个长度单位。

然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度。

请你设计一个程序,帮助乔治计算木棒的可能最小长度。

每一节木棍的长度都用大于零的整数表示。

解题思路

我们先将所有木棒总长度与其中最长的木棍长度记录下来。将记录小木棍长度的数组排序,然后从最长的木棍枚举每根木棒可能的长度,优化:根据这个小木棒能不能被sum整除来进行第一次判断这个小木棒长度是否正确。进入bfs三个参数,u:构造了多少小木棍,cur:构造小木棍的长度,cnt:数组下标。

我们依次用断掉的木棍来凑出我们枚举的木棍长度并将当前枚举的木棍标记为已使用,当前木棍凑不出来就取消当前木棍的已使用标记,此处可进行一个优化:当第一个木棍与最后一个木棍搜索失败时,就一定搜不到了(第一个木棍搜不到了,那它就永远凑不出来了。最后一个也是,肯定是将前面的都用完之后再用的最后一个,不行肯定就是失败了) 优化:我们可以将长度相同的小木棍跳过,当当前凑的小木棍长度乘凑的小木棍根数等于木棒从长度时就return true; 当当前小木棍长度等于枚举的小木棍长度时就进入下一个小木棍的枚举。

AC代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

int n;
int a[100];
int len=0,sum=0;
bool judge[100];
//u:构造了多少根小木棍,cur:构造小木棍的长度,cnt:数组下标
bool dfs(int u,int cur,int cnt)
{
    if(cur*u==sum)//凑够了
    {
        //由于初始传入的len所以当最后一次cur==len时,没有经过下面u+1,所以u是刚好的
        
        // cout<<"u: "<<u<<endl;
        // for(int i=0;i<n;i++)
        // cout<<judge[i]<<' ';
        // cout<<endl;
        return true;
    }
    if(cur==len)//这根木棍达到len了,换下一根木棍
    return dfs(u+1,0,0);
    
    for(int i=cnt;i<n;i++)
    {
        if(judge[i])
        continue;
        if(cur+a[i]<=len)
        {
            judge[i]=true;
            if(dfs(u,cur+a[i],i+1))
            return true;//直接成功
            judge[i]=false;//失败了,当没用过
        }
        //第一个木棍就搜索不到答案,或者
        //最后一个木棍搜索失败
        if(!cur||cur+a[i]==len)
        {
            return false;
        }
        
        int j=i+1;
        while(j<n&&a[i]==a[j]) j++;
        i=j-1;//将重复的i跳过,排序的作用
    }
    return false;
}

int main()
{
    while(scanf("%d",&n)&&n!=0)
    {
        sum=0;
        len=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];//计算所有木棍总长度
            len=max(len,a[i]);//len肯定不能比零散的木棍小
        }
        memset(judge,false,sizeof(judge));
        sort(a,a+n,greater<int>());
        while(1)
        {
            if(sum%len==0&&dfs(0,len,0))//传入len的话
            {
                cout<<len<<endl;
                break;
            }
            len++;
        }
    }
    return 0;
}

2. 飞机降落

4957. 飞机降落 - AcWing题库

有 NN 架飞机准备降落到某个只有一条跑道的机场。

其中第 ii 架飞机在 TiTi 时刻到达机场上空,到达时它的剩余油料还可以继续盘旋 DiDi 个单位时间,即它最早可以于 TiTi 时刻开始降落,最晚可以于 Ti+DiTi+Di 时刻开始降落。

降落过程需要 LiLi 个单位时间。

一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。

请你判断 NN 架飞机是否可以全部安全降落。

解题思路

我们可以用一个结构体来存储输入的到达的时刻与可以盘旋的时间与下降所需的时间(根据题目可以看出,下降所需时间不算在可以盘旋的时间里)我这里用pair<int,pair<int,int>>来存储的,看起来会麻烦些。

bool dfs参数:cnt来记录有多少飞机已经降落,ti表示当前的时刻(注意:会有当前时刻到达的飞机都降落完了,就要跳到下一个时间)

每一次都要从第一架飞机开始枚举,看如果当前这架飞机没有降落并且超过了到达时间+盘旋时间就失败了返回false,判断一下时间有没有到没有到就将时间改为降落时间(上面要用一个临时变量记录时间,这里改变的也是临时变量)然后看这架飞机没走过就将其标记为走过然后递归看这里让这架飞机飞能不能让飞机全飞完,不能就取消对这架飞机的标记。当降落的飞机==飞机总数时就返回true,根据返回值输出 YES或NO

AC代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int t;
int n;
pair<int,pair<int,int>> car[15];
bool st[15];//判断飞机是否降落

//cnt判断有几架飞机降落了,ti是时间
bool dfs(int cnt,int ti)
{
    if(cnt==n) return true;
    for(int i=0;i<n;i++)
    {
        int tmp=ti;//可能有的飞机没到点需要改成到的时刻
        if(!st[i]&&ti>car[i].first+car[i].second.first)//这一架没降落,并且时间超时
            return false;
        if(tmp<car[i].first)//现在没到i这架飞机的到达时刻
        tmp=car[i].first;
        if(!st[i])
        {
            st[i]=true;
            if(dfs(cnt+1,tmp+car[i].second.second)) return true;
            st[i]=false;
        }
    }
    return false;
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        //分别是到达的时刻,还能停留的时间,降落所需时间
        for(int i=0;i<n;i++)
        scanf("%d%d%d",&car[i].first,&car[i].second.first,&car[i].second.second);


        memset(st,false,sizeof st);
        if(dfs(0,0)) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

3. 母亲的牛奶

1355. 母亲的牛奶 - AcWing题库

农夫约翰有三个容量分别为 A,B,CA,B,C 升的挤奶桶。

最开始桶 AA 和桶 BB 都是空的,而桶 CC 里装满了牛奶。

有时,约翰会将牛奶从一个桶倒到另一个桶中,直到被倒入牛奶的桶满了或者倒出牛奶的桶空了为止。

这一过程中间不能有任何停顿,并且不会有任何牛奶的浪费。

请你编写一个程序判断,当 AA 桶是空的时候,CC 桶中可能包含多少升牛奶,找出所有的可能情况。

解题思路

这几个桶只要有牛奶可以互相倒牛奶,只有两种可能把要倒的桶倒满或者把自己倒空

用一个结构体包含abc代表当前各个瓶子奶的容量,由于数据量很小所以我们可以用一个三维数组来存它的状态,创建一个队列存上面的结构体,枚举一个瓶子倒一个瓶子接(不能是同一个瓶子),根据要倒牛奶瓶子的牛奶量和要接牛奶瓶子的剩余空间,来更新队列依次直到队列空。

我们遍历状态数组,输出所有当A瓶子为空时有过的C的值

AC代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
    int a,b,c;//记录当前a,b,c分别多少牛奶
};
int A,B,C;
bool st[25][25][25];//当值为true说明三个下标表示三个杯子分别盛的容量
queue<node> q;
int bfs(int a,int b,int c)
{
    q.push({a,b,c});//入队
    int val[3]={A,B,C};
    st[a][b][c]=true;
    while(!q.empty())
    {
        node t=q.front();
        q.pop();
        for(int i=0;i<3;i++)//枚举第i个桶向第j个桶里倒牛奶
        {
            for(int j=0;j<3;j++)
            {
                if(i!=j)//不能自己给自己倒
                {
                    int s[3]={t.a,t.b,t.c};
                    if(s[i]==0)
                    continue;
                    //比较i个桶剩的牛奶,与第j桶还能放进去的牛奶,哪个更少
                    int cmp=min(s[i],val[j]-s[j]);
                    s[i]-=cmp;//i桶减去
                    s[j]+=cmp;//j桶加上
                    if(!st[s[0]][s[1]][s[2]])
                    {
                        st[s[0]][s[1]][s[2]]=true;
                        q.push({s[0],s[1],s[2]});
                    }
                    
                }
            }
        }
    }
}

int main()
{
    scanf("%d%d%d",&A,&B,&C);//分别能存储的容量
    bfs(0,0,C);
    
    for(int j=0;j<=C;j++)
    {
        for(int i=0;i<=B;i++)
        {
            if(st[0][i][j])
            printf("%d ",j);
        }
    }
    
    
    return 0;
}

4. 全球变暖

1233. 全球变暖 - AcWing题库

你有一张某海域 N×NN×N 像素的照片,”.”表示海洋、”#”表示陆地,如下所示:

.......
.##....
.##....
....##.
..####.
...###.
.......

其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 22 座岛屿。

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。

具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

例如上图中的海域未来会变成如下样子:

.......
.......
.......
.......
....#..
.......
.......

请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

 解题思路

就是遍历所有的大陆,查看陆地数量与临海的陆地数量是否相同,其余就是普通的洪水覆盖模板

AC代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;

int n;
char map[1010][1010];
int dx[4]={1,0,0,-1};
int dy[4]={0,1,-1,0};
queue<pair<int,int>> qu;
bool states[1010][1010];
    int cnt=0;
void bfs(int x,int y,int &sum1,int &sum2)
{
    qu.push({x,y});
    states[x][y]=true;
    while(!qu.empty())
    {
        auto t=qu.front();
        sum1++;
        qu.pop();
        bool falg=false;
        for(int i=0;i<4;i++)
        {
            int a=t.first+dx[i];
            int b=t.second+dy[i];
            if(a<0||b<0||a>=n||b>=n) continue;
            
            if(states[a][b]) continue;//已经走过的
            if(map[a][b]=='.')
            {
                falg=true;//说明上一个邻海
                continue;
            }
            qu.push({a,b});
            states[a][b]=true;
        }
        if(falg) sum2++;//统计临海的数量
    }
    if(sum2==sum1)
    cnt++;
    
}


int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        { 

            cin>>map[i][j];

        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        { 
            int cnt1=0;//记录岛屿边缘数量
            int cnt2=0;//记录岛屿陆地数量
            if(!states[i][j]&&map[i][j]=='#')
            bfs(i,j,cnt1,cnt2);
        }   
    }



    cout<<cnt<<endl;
    return 0;
}

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

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

相关文章

Web端——超级马里奥【简化版】

1.介绍 这是一个简单的受超级马里奥启发的平台游戏演示&#xff01;这个基于网络的游戏包括&#xff1a; 角色移动&#xff1a;使用箭头键让马里奥向左和向右移动&#xff0c;空格键或向上箭头键跳跃。跳跃平台&#xff1a;游戏中有多个可以跳跃的平台&#xff0c;包括经典的…

PEFT介绍及其源码解析

PEFT库介绍 PEFT&#xff08;Parameter-Efficient Fine-Tuning&#xff0c;参数高效微调&#xff09;是由 Hugging Face 开源的一个高效微调库&#xff0c;旨在通过少量可训练参数实现对大型预训练模型的快速适应&#xff0c;从而显著降低计算和存储成本。 核心功能与优势 多…

osgEarth安装总结

第一步&#xff1a;安装OSG 直接通过git下载源码&#xff0c;使用cmake进行编译&#xff0c; git clone --depth 1 https://github.com/openscenegraph/OpenSceneGraph.git mkdir build cd build cmake .. make sudo make isntall编译过程中缺什么库&#xff0c;就安装什么库 …

实体机器人在gazebo中的映射

这一部分目的是将真实的机器人映射到gazebo中&#xff0c;使得gazebo中的其他虚拟机器人能识别到真实世界的wheeltec机器人。 真实机器人的型号的wheeltec旗下的mini_mec。 一、在wheeltec官方百度云文档中找到URDF原始导出功能包.zip 找到对应的包 拷贝到工作空间下 在原有…

8、HTTP/1.0和HTTP/1.1的区别【高频】

第一个是 长连接&#xff1a; HTTP/1.0 默认 短连接&#xff0c;&#xff08;它也可以指定 Connection 首部字段的值为 Keep-Alive实现 长连接&#xff09;而HTTP/1.1 默认支持 长连接&#xff0c;HTTP/1.1是基于 TCP/IP协议的&#xff0c;创建一个TCP连接是需要经过三次握手的…

kafka-leader -1问题解决

一. 问题&#xff1a; 在 Kafka 中&#xff0c;leader -1 通常表示分区的领导者副本尚未被选举出来&#xff0c;或者在获取领导者信息时出现了问题。以下是可能导致出现 kafka leader -1 的一些常见原因及相关分析&#xff1a; 1. 副本同步问题&#xff1a; 在 Kafka 集群中&…

stm32hal库寻迹+蓝牙智能车(STM32F103C8T6)

简介: 这个小车的芯片是STM32F103C8T6&#xff0c;其他的芯片也可以照猫画虎,基本配置差不多,要注意的就是,管脚复用,管脚的特殊功能,(这点不用担心,hal库每个管脚的功能都会给你罗列,很方便的.)由于我做的比较简单,只是用到了几个简单外设.主要是由带霍尔编码器电机的车模,电机…

使用DeepSeek/ChatGPT等AI工具辅助编写wireshark过滤器

随着deepseek,chatgpt等大模型的能力越来越强大&#xff0c;本文将介绍借助deepseek&#xff0c;chatgpt等大模型工具&#xff0c;通过编写提示词&#xff0c;辅助生成全面的Wireshark显示过滤器的能力。 每一种协议的字段众多&#xff0c;流量分析的需求多种多样&#xff0c;…

飞鱼科技游戏策划岗内推

协助策划完成相关工作&#xff0c;包括但不仅限于策划配置&#xff0c;资料搜集&#xff0c;游戏体验&#xff1b; 游戏策划相关作品&#xff1b;游戏大赛经历&#xff1b;游戏demo制作经历&#xff1b;游戏公司策划岗位实习经历优先 内推码 DSZP7YFU

解决中文乱码:字符编码全攻略 - ASCII、Unicode、UTF-8、GB2312详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

Mesh自组网技术及应用

前言&#xff1a; Mesh自组网随着无线技术发展&#xff0c;在消费领域最近比较有热度。当然应用的场景不限于普通消费领域&#xff0c;在工业、军事领域被也是越来越重要。 一、什么是无线Mesh技术 1.1 无线自组网概念 无线Mesh是一种智能、自组织、多跳、移动、对等、去中心…

滑动验证组件-微信小程序

微信小程序-滑动验证组件&#xff0c;直接引用就可以了&#xff0c;效果如下&#xff1a; 组件参数&#xff1a; 1.enable-close&#xff1a;是否允许关闭&#xff0c;默认true 2.bind:onsuccess&#xff1a;验证后回调方法 引用方式&#xff1a; <verification wx:if&qu…

11.Docker 之分布式仓库 Harbor

Docker 之分布式仓库 Harbor Docker 之分布式仓库 Harbor1. Harbor 组成2. 安装 Harbor Docker 之分布式仓库 Harbor Harbor 是一个用于存储和分发 Docker 镜像的企业级 Registry 服务器&#xff0c;由 VMware 开源&#xff0c;其通过添加一些企业必需的功能特性&#xff0c;例…

(一)趣学设计模式 之 单例模式!

目录 一、啥是单例模式&#xff1f;二、为什么要用单例模式&#xff1f;三、单例模式怎么实现&#xff1f;1. 饿汉式&#xff1a;先下手为强&#xff01; &#x1f608;2. 懒汉式&#xff1a;用的时候再创建&#xff01; &#x1f634;3. 枚举&#xff1a;最简单最安全的单例&a…

Chrome 浏览器(版本号49之后)‌解决跨域问题

谷歌浏览器解决跨域问题 如何查看 Chrome 浏览器版本号 打开 Chrome 浏览器点击右上角的三个点&#xff0c;打开“设置”页面 点击“关于Chrome” 查看版本号 解决跨域操作&#xff1a;windows系统为例 方法一&#xff1a;命令行启动方式&#xff08;最简单&#xff09; …

python中的JSON数据格式

文章目录 什么是json主要功能Python数据和Json数据的相互转化 什么是json JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据。JSON本质上是一个带有特定格式的字符串。 主要功能 json就是一种在各个编程语言中流通的数据格式&#xff0c;负责不同编…

汽车智能制造企业数字化转型SAP解决方案总结

一、项目实施概述 项目阶段划分&#xff1a; 蓝图设计阶段主数据管理方案各模块蓝图设计方案下一阶段工作计划 关键里程碑&#xff1a; 2022年6月6日&#xff1a;项目启动会2022年12月1日&#xff1a;系统上线 二、总体目标 通过SAP实施&#xff0c;构建研产供销协同、业财一…

JavaWeb-在idea中配置Servlet项目

文章目录 在idea中进行Servlet项目的配置(较新的idea版本)创建一个空的JavaSE项目(Project)创建一个普通的JavaSE板块(module)添加Web项目的配置定义一个对象模拟实现接口在web.xml中配置路径映射配置项目到Tomcat服务器启动Tomcat服务器进行测试 在idea中进行Servlet项目的配置…

【深度学习神经网络学习笔记(二)】神经网络基础

神经网络基础 神经网络基础前言1、Logistic 回归2、逻辑回归损失函数3、梯度下降算法4、导数5、导数计算图6、链式法则7、逻辑回归的梯度下降 神经网络基础 前言 Logistic 回归是一种广泛应用于统计学和机器学习领域的广义线性回归模型&#xff0c;主要用于解决二分类问题。尽…

力扣hot100 —— 电话号码字母组合; 子集 (非回溯做法)简单易懂

由于博主对回溯也不是很熟悉&#xff0c;这里提出一种简单易懂的解法&#xff08;有点暴力&#xff09; 解题思路&#xff1a; 每个数字对应有自己的字母串&#xff1b; 首先遍历将每个字母存入也就是 res{{a},{b},{c}} 然后遍历后续数子对应的字母&#xff0c;让每个字母与…