2023/4/18往日题目总结

news2024/10/7 4:36:02

搜索路径状态记录

1076. 迷宫问题 - AcWing题库

//以最简单的迷宫问题为例,如何记录走迷宫的路径,其实只需要记录一下状态即可
//也就是记录一下这个点是从哪个点来的,最后从终点开始输出即可(此时输出的是逆序)
#include<iostream>
#include<cstdio>
#include<queue>

using namespace std;

typedef pair<int,int> PII;

const int N = 1010;
const int dx[]={0,0,1,-1}, dy[]={1,-1,0,0};

int n;
int maze[N][N];
PII path[N][N]; //记录每个点的来源

void bfs()
{
    queue<PII> q;
    q.push({0,0});
    
    while(q.size())
    {
        auto t = q.front();
        q.pop();
        int x = t.first, y = t.second;
        
        for(int i = 0 ; i < 4; i ++)
        {
            int nx = x + dx[i], ny = y + dy[i];
            
            if(nx >= 0 && nx < n && ny >= 0 && ny < n && !maze[nx][ny])
            {
                maze[nx][ny] = 1;
                q.push({nx,ny});
                path[nx][ny] = t;
            }
        }
    }
}
/*****************************************************************/
void dfs(int x ,int y)  //递归的输出答案路径
{
    if(x == 0 && y == 0)
    {
        printf("0 0\n");
        return;
    }
    
    dfs(path[x][y].first, path[x][y].second);
    printf("%d %d\n", x, y);
}
/*****************************************************************/

int main()
{
    cin >> n;
    for(int i = 0 ; i < n ; i ++)
        for(int j = 0; j < n ; j ++)
            scanf("%d", &maze[i][j]);
    bfs();
    dfs(n-1, n-1);
    return 0;
}

多源BFS问题

173. 矩阵距离 - AcWing题库

//由于BFS的特效,我们处理多源的问题的时候,仅仅只需要把所有的起点(Flood-fiil的点)
//加入队列中即可,用这些点去更新其他点到这些点的距离,当某个点第一次被访问
//就说明是与它距离最近的点访问到了它,此时就是最短距离
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>

using namespace std;

typedef pair<int,int> PII;

const int N = 1010;

int n,m;
int dist[N][N];
char g[N][N];
queue<PII> q;

void bfs()
{
    int dx[]={0,1,0,-1}, dy[]={1,0,-1,0};
    
    while(q.size())
    {
        auto t = q.front();
        q.pop();
        for(int i = 0; i < 4;  i ++)
        {
            int x = t.first + dx[i], y = t.second + dy[i];
            
            if(x < 0 || y < 0 || x >= n ||  y >= m) continue;
            if(dist[x][y] != -1) continue;
            
            dist[x][y] = dist[t.first][t.second] + 1;
            q.push({x,y});
        }
    }
}
int main()
{
    memset(dist, -1, sizeof dist);
    
    scanf("%d%d", &n, &m);
    
    for(int i = 0 ; i < n ; i ++)
    {
        scanf("%s", g[i]);
        for(int j = 0 ; j < m ; j++)
            if(g[i][j] == '1')
            {
                q.push({i,j});
                dist[i][j] = 0;
            }
    }
    bfs();
    for(int i = 0 ; i < n; i ++)
    {
        for(int j = 0 ; j < m ; j ++)
            printf("%d ", dist[i][j]);
        puts("");
    }
    return 0;
}

双向广搜优化

177. 噩梦 - AcWing题库

190. 字串变换 - AcWing题库

//双向广搜是一个优化效果很好的算法,往往我们从一个点开始搜索状态,其数量是很庞大的,下面用
//图像来表示该算法的优化效果
//双向广搜常用来优化类似于字串变换这种把一个图,一个字符串当作一个状态来表示的题

 

不同边权的BFS问题之01边权

175. 电路维修 - AcWing题库

3675. 逃离迷宫 - AcWing题库

//在处理不同边权的问题时,我们为了保证BFS队列中的单调性和两段性
//ps:不知道什么是单调性和两段性的可以去翻看算法竞赛进阶指南
//我们把通过代价较小的边到达的点加入到队头,把代价耗费较大的加入到队尾
//每个点可以多次入队,但是类似于dijkstra算法,每个点出队的时候就一定是最优解
//所以记录下每个点出队的状态即可

不同边权的BFS问题之优先队列优化 

176. 装满的油箱 - AcWing题库

//其实就是堆优化版的dijkstra
//当每条边的权重都不相同的时候,我们为了保证每次从队列中取出的元素是代价耗费最小的状态
//我们利用优先队列的性质,即按权重处理大小,每次取出队头元素就保证了权重最小的状态
//同样的,我们允许每个状态(点)多次入队,但是一旦出队就是最优解,记录一下即可

BFS优化之Astar算法 

179. 八数码 - AcWing题库

178. 第K短路 - AcWing题库

//为了提高搜索效率,我们在用“从起始状态到当前状态耗费代价大小”为依据去每次选择最小
//的状态出队更新的基础上,再额外增加一个出队的依据
//“当前状态到目标状态的估计耗费”
//这样我们以“总代价”=“从起点出发已经耗费的代价”+“预计到终点需要耗费的代价”为标准
//每次选择“总代价”最小的状态出队扩展
//故以此特性我们需要在普通BFS的基础上作出两点改进
//*1,改用优先队列,大小排序的标准为“总代价”
//*2,设计“估价函数”f(state),用于估计出当前状态到目标状态所需耗费的代价

//对于第二点的f(state),我们要求估计值≤实际值
//实际题目中,f(state)的设计是很套路,模板化的,本身需要用到Astart的题就很少

 搜索状态记录之二进制存储 

166. 数独 - AcWing题库

//以经典例题数独为例,讲解用二进制存储状态的方法

//前置知识

//与,或,非,异或,左移,右移这几个二进制数位运算
//本题中,我们需要记录每一行每一列每一个子九宫格中可以用以及用了哪些数字

//用数字的二进制位去存储状态
//每行,每列,每个九宫格,一共9个状态,就只要一个9位的二进制数
//9个位置的数字,1表示可以用,0表示不能用
//那么对于每一个空位上可以用的数字,我们只需要将用于记录这一行这一列这一个九宫格的二进制数
//做一遍&运算,即可求得交集,再循环使用lowbit运算即可枚举该空位的可用数字


const int N = 9;
int row[N], col[N], cell[3][3];//记录行列与九宫格的状态
int ones[1 << N];

/***************为了加速,我们提前打好表************************************/
for(int i = 0 ;i < N ; i ++) maps[1 << i] = i;
//lowbit运算返回的是数值,而我们需要的是二进制数位中的1的位置
//maps[1(1)] = 0;maps[2(10)] = 1;maps[8(1000)] = 3

/*****************lowbit运算 lowbit(20(10100)=4(100)*******************/
inline int lowbit(int x)
{
    return x & -x;
}
/*****************求不同状态的交集,使用&运算即可***************************/
inline int get(int x, int y)
{
    return row[x] & col[y] & cell[x/3][y/3];
}
/*****************初始化状态,即二进制数位全部改为1*************************/
void init()
{
//初始化(1 << N) - 1的解释:
//1 << N = 512,再减1等于511,我们用二进制的运算看比较清楚:1000000000 - 1 = 111111111
    for(int i = 0; i < N; i ++) row[i] = col[i] = (1 << N) - 1;
    for(int i = 0; i < 3;  i ++)
        for(int j = 0; j < 3; j ++)
            cell[i][j] = (1 << N) - 1;
}


//具体使用

//1,修改第x行y列的空位状态
//假设在该位置上放置了数字t(1~9)
t -= 1;//我们需要映射到0~8
row[x] -= 1 << t;  //减去1<<t相当于在二进制数位上把第t个位置上的1改成0
col[y] -= 1 << t;
cell[x/3][y/3] -= 1 << t;

//2,枚举第x行y列的空位的可用数字
for(int i = get(x,y); i ; i -= lowbit(i))
{
    int t = maps[lowbit(i)]; //t就是可用的数字(0~8->1~9)
}

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

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

相关文章

PHP+python+nodejs+springboot+vue 大学生提问论坛系统

在各学校的教学过程中&#xff0c;大学生提问论坛是一项非常重要的事情。随着计算机多媒体技术的发展和网络的普及。 本文首先介绍了大学生提问论坛的发展背景与发展现状&#xff0c;然后遵循软件常规开发流程&#xff0c;首先针对系统选取适用的语言和开发平台&#xff0c;根…

微信小程序的生命周期函数有哪些,以及执行过程?

目录 1、应用的生命周期 2、页面的生命周期 3、组件的生命周期 4、执行顺序 小程序中&#xff0c;生命周期主要分成了三部分&#xff1a; ① 应用的生命周期 ② 页面的生命周期 ③ 组件的生命周期 1、应用的生命周期 在 app.js 里面调用&#xff0c;通过…

【hello Linux】理解文件系统

目录 创建文件的过程&#xff1a; 删除文件的过程&#xff1a; 创建目录的过程&#xff1a; 查看inode编号&#xff1a; 硬链接 软链接 Linux&#x1f337; 我们知道文件所有数据 文件内容 文件属性信息&#xff1b; 未打开的文件是被存放到磁盘/固态硬盘中的&#xff1b; …

0201概述-网关Gateway-微服务架构

文章目录 1 前言2 项目引入3 术语4 工作原理5 配置示例5.1 简洁配置5.2 展开配置 6 Predicate7 GatewayFilter7.1 StripPrefix GatewayFilter7.2 RequestRateLimiter GatewayFilter① pom 依赖② 配置按照请求IP 的限流 6 Global Filters7 网关超时配置7.① 配置全局路由超时时…

用java 实现二叉树创建

二叉树是数据结构中的一个重要的概念&#xff0c;二叉树的概念最早由 Linus Torvalds在1958年提出。他给出了一个树形数据结构&#xff0c;可以用来存储二叉树。每个节点的左子树和右子树都是空&#xff0c;中间层是子树。在一个给定的空间中&#xff0c;每一个节点都有两个左右…

Adobe认证证书含金量

当今数字时代&#xff0c;Adobe软件已经成为了许多人工作和创造的必备工具。为了证明自己在使用Adobe软件方面的专业能力&#xff0c;许多人选择参加Adobe认证考试并获取Adobe认证证书。 那么&#xff0c;这些证书的含金量究竟如何呢&#xff1f; 首先&#xff0c;需要指出的…

C++:Article:链接器(二):符号决议

链接器 1. C源文件都有些什么1.1 . 目标文件里有什么 2. 符号表 Symbol table2.1. 符号表的位置2.2. 符号的决议2.3. 符号决议过程 3. 实例说明3.1. 意外出现3.2 总结排查 在上篇文章中&#xff0c;我们介绍了 链接器基本概念&#xff0c;我们知道所有的应用程序否是连接器将所…

基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析

植被是陆地生态系统中最重要的组分之一&#xff0c;也是对气候变化最敏感的组分&#xff0c;其在全球变化过程中起着重要作用&#xff0c;能够指示自然环境中的大气、水、土壤等成分的变化&#xff0c;其年际和季节性变化可以作为地球气候变化的重要指标。此外&#xff0c;由于…

Cesium基础教程

一、概述 Cesium是国外一个基于javascript的地图引擎&#xff0c;支持3D、2D、2.5D形式的展示&#xff0c;可以自行绘制图形、高亮区域&#xff0c;并提供良好的触摸支持&#xff0c;并支持大多数的浏览器和移动端。 Cesium 是一个跨平台、跨浏览器的展示三维地球和地图的 ja…

【PWN刷题__ret2text】[CISCN 2019华北]PWN1

ret2text~ 前言 依旧是简单的ret2text 一、checksec查看 No canary found 没有开启栈溢出保护 二、IDA反汇编 双击进入func() 发现后门函数system("cat/flag")&#xff1b;根据语义&#xff0c;函数提供了修改v1&#xff0c;判断v2是否等于11.28125&#xff0c;如…

【倒计时4天】金融服务用户体验专场沙龙开启预约

易观&#xff1a;数智化浪潮下&#xff0c;金融业务用户运营从线下向全渠道延伸。用户体验已成为⾦融机构打造差异化的重要抓手。此外&#xff0c;随着⽤户体验的全⾯数字化和精细化&#xff0c;⽤户体验贯穿于整个客户旅程中&#xff0c;做好用户体验管理&#xff0c;体现差异…

okio篇 1.Buffer

总览: Okio的两个基本概念&#xff1a;Source和Sink。Source对标基础io库中的InputStream&#xff0c;负责读数据。Sink对标OutputStream&#xff0c;负责写数据。 Source和Sink的内部实现&#xff0c;都是一个Buffer。Buffer从字面意思理解就是一个缓冲区&#xff0c;跟Buff…

『pyqt5 从0基础开始项目实战』12. 实现多线程循环检测数据的开始和停止(保姆级图文)

目录 最终效果导包和框架代码 main.py避免重复执行开始与停止事件表格更新事件 scheduler.py初始化开始线程停止线程在线程列表中删除线程TaskThread新建线程StopThread停止线程完整代码main.pythreads.pyscheduler.py 总结 欢迎关注 『pyqt5 从0基础开始项目实战』 专栏&#…

C. Anadi and Domino(思维 + 枚举)

Problem - C - Codeforces 阿纳迪有一副多米诺骨牌。每张多米诺骨牌都有两个部分&#xff0c;每个部分都包含一些小点。对于每一个a和b&#xff0c;如1≤a≤b≤6&#xff0c;1≤a≤b≤6&#xff0c;正好有一块多米诺骨牌的一半是a点&#xff0c;另一半是b点。这组多米诺骨牌正好…

手动实现 Tomcat 底层机制+ 自己设Servlet

目录 手动实现 Tomcat 底层机制 自己设Servlet 完成小案例 运行效果 此项目用maven至于怎么配置在下一篇文章 创建cal.html CalServlet.java web.xml WebUtils 问题: Tomcat 整体架构分析 测试分析&#xff1a; 抓包情况 手动实现 Tomcat 底层机制 自己设计 Serv…

十个高质量工具网站推荐,AI自动抠图换背景,任意背景自动融合

AI 背景更换是一种利用生成式人工智能创建新图像背景的软件工具。与传统方法需要移除原有的背景并更换新的不同&#xff0c;AI背景生成器使用先进的算法生成与前景完美融合的全新背景。这项技术彻底改变了图像编辑的方式&#xff0c;为设计提供了更多的创造自由和灵活性。 特点…

数据结构--B树、B+树

数据结构--B树、B树 1. 什么是B树2.建立B树的要求3.什么是B树4.Mysql里面为什么使用B树作为索引结构&#xff1f; 1. 什么是B树 B树是一种数据结构&#xff0c;用于在硬盘或其他非易失性存储介质上快速存储和访问大量数据。它是一种平衡树&#xff0c;其每个节点可以存储多个键…

zabbix SNMP traps 监控案例

目标 根据H3C网络设备 发送 SNMP trap 信息进行网络端口的告警。 具体过程 继上次配置的trap 方式进行监控一个案例。 其中log数据中的内容是&#xff1a; 20230330.163810 ZBXTRAP 192.168.21.148 UDP: [192.168.21.148]:52289->[172.18.18.2]:1162 DISMAN-EVENT-MIB::…

Keil5软件安装方法(兼容stm32与c51方法)

目录 一、下载软件包 二、安装软件 1、安装C51v960a.exe (1&#xff09;右键以管理员权限运行程序 &#xff08;2&#xff09;开始安装软件 &#xff08;3&#xff09;勾选协议 &#xff08;4&#xff09;选择安装路径 &#xff08;5&#xff09;填写名字与邮箱 &#xff0…

我国元宇宙行业分析:政策、技术、资金助推行业探索多元化应用场景

1.元宇宙行业概述、特征及产业链图解 元宇宙是人类运用数字技术构建的&#xff0c;由现实世界映射或超越现实世界&#xff0c;可与现实世界交互的虚拟世界&#xff0c;具备新型社会体系的数字生活空间&#xff0c;主要具有沉浸式体验、开放性、虚拟身份、不断演化、知识互动、…