算法搜索(2024/2/5)

搜索 

目录

搜索 

深度优先搜索 

广度优先搜索  (宽度优先搜索)

今日刷题  

p1387 最大正方形

题目描述

输入格式

输出格式

输入输出样例


1、定义:

搜索是一种通过穷举所以可能的解的状态,来求得题目所需求的解或最优解的方法。

【即通过枚举解的所有可能状态,来寻求一个解或者最优解】

【状态】对某一系统在某一时刻的数学描述。

【状态转移】从一种状态转化为另一种状态。

2.分类:

深度优先搜索(dfs)和  广度优先搜索(bfs)

深度优先搜索:

广度优先搜索:

【注意】序号顺序代表遍历顺序!!

深度优先搜索 

1、算法核心:沿着树的深度遍历树的结点,尽可能深的搜索树的分支。当结点v的所有边都已经遍历过来,搜索将回溯到发现结点v的那条边的起始结点。这一过程一直进行到已经发现从源结点可达到的所有结点为止。如果还存在未被发现的结点,则选择其中一个作为源结点并重复以上过程,整个过程反复进行直到所有结点都被遍历为止。属于盲目搜索

2、基本原则:按照某种条件往前试探搜索,如果前进中遭到失败,则退回另选择道路继续搜索,直到找到满足条件的目标位置。

我找了一个清晰的图作为解释说明:

代码实现:

int dxy[4][2]={//模拟上下左右四个方向-1,0,    //上(x减一,y不变)1, 0,    //下0,-1,    //左0, 1     //右}
void dfs(int x0,int y0)
{if(x0,y0满足某种条件)     //找到目标点{//执行操作如输出路径等return;}for(int i=0;i<4;i++)     //遍历四个方向每一个分支,对每一个分支都进行深度搜索{int dx=dxy[i][0];   //移动后的横坐标int dy=dxy[i][1];   //移动后的纵坐标if(坐标越界||遇到障碍物||...)     //不满足条件continue;//执行操作dfs(dx,dy)                     //深度遍历//遍历结束恢复操作}
}

广度优先搜索  (宽度优先搜索)

1、算法核心:每次都尝试访问同一层的结点,如果同一层都访问完了,再访问下一层,这样做结果是bfs算法找到的路径是从起始结点开始的最短合法路径(即这条路径包含的边数最小)。

图解:

代码实现:

static const int dirs[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
void bfs(int row, int col) 
{if (row,col满足某种条件) {return;}int * queue = (int *)malloc(sizeof(int) * m * n);int head = 0;int tail = 0;                          //  双指针实现队列先进先出queue[tail++] = row * n + col; while (head != tail){int row = queue[head] / n;int col = queue[head] % n;head++;for (int i = 0; i < 4; i++) {int newRow = row + dirs[i][0], newCol = col + dirs[i][1];if 满足某种条件(newRow >= 0 && newRow < m && newCol >= 0 && newCol < n &&……) {对点进行某种操作操作queue[tail++] = newRow * n + newCol;}}}free(queue);
}


今日刷题  

p1387 最大正方形

题目描述

在一个 n×m 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形,输出边长。

输入格式

输入文件第一行为两个整数 n,m(1≤n,m≤100),接下来 n 行,每行 m 个数字,用空格隔开,0 或 1。

输出格式

一个整数,最大正方形的边长。

输入输出样例

输入 

4 4
0 1 1 1
1 1 1 0
0 1 1 0
1 1 0 1

输出 

2

思路:

1.以【i,j】为正方形的左上角,使用广搜遍历直到遇到0为止。

2.bfs遍历:遍历(x+1,y)、(x,y+1)、(x+1,y+1);因为广搜具有层次性,所以能保证1~l长度的正方形都能依次遍历。

AC代码如下:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>using namespace std;
int n, m,f[310][310];
int a[310][310];
int main()
{scanf("%d %d", &n,&m);for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> a[i][j];int ans = 0;for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++){if (a[i][j] == 1)f[i][j] = min(f[i][j - 1], min(f[i - 1][j], f[i - 1][j - 1])) + 1;ans = max(f[i][j],ans);}printf("%d\n",ans);return 0;
}

祝大家有所收获!!

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年哪个前端框架用的最多?

2023 年&#xff0c;TypeScript 的每月下载量持续稳定增长&#xff0c;年度累计下载量高达2,071,832,110&#xff08;20.7 亿&#xff09;&#xff0c;展现了强大的市场需求和用户认可。 本文来通过详细的数据&#xff08;2023 年 npm 累计下载量&#xff09;&#xff0c;看看…

离线数仓(一)【数仓概念、需求架构】

前言 今天开始学习数仓的内容&#xff0c;之前花费一年半的时间已经学完了 Hadoop、Hive、Zookeeper、Spark、HBase、Flume、Sqoop、Kafka、Flink 等基础组件。把学过的内容用到实践这是最重要的&#xff0c;相信会有很大的收获。 1、数据仓库概念 1.1、概念 数据仓库&#x…

正则可视化工具:学习和编写正则表达式的利器

引言 正则表达式是一种强大的文本匹配和处理工具&#xff0c;但对于初学者和非专业开发者来说&#xff0c;编写和理解正则表达式可能是一项具有挑战性的任务。为了帮助人们更好地学习和编写正则表达式&#xff0c;正则可视化工具应运而生。本文将探讨正则可视化工具的优点&…

【安装记录】安装 netperf 和 perf

这是一篇发疯随笔X.X 我的环境是虚拟机debian12&#xff0c;出于种种原因&#xff0c;之前直接使用apt-get install netperf apt-get install perf指令直接安装&#xff0c;报错找不到包 然后上网搜了一堆教程&#xff0c;有说下载netperf源码编译的&#xff0c;那些教程里面有…

C++入门学习(二十七)跳转语句—break语句

1、与switch语句联合使用 C入门学习&#xff08;二十三&#xff09;选择结构-switch语句-CSDN博客 #include <iostream> #include <string> using namespace std;int main() { int number;cout<<"请为《斗萝大路》打星(1~5※)&#xff1a;" &…

AJAX——常用请求方法

1 请求方法 请求方法&#xff1a;对服务器资源&#xff0c;要执行的操作 2 数据提交 场景&#xff1a;当数据需要在服务器上保存 3 axios请求配置 url&#xff1a;请求的URL网址 method&#xff1a;请求的方法&#xff0c;GET可以省略&#xff08;不区分大小写&#xff09; …

IT行业有哪些证书含金量高?

1.Amazon Certified Cloud Practitioner 转码小白超友好的一门入门级证书&#xff0c;对于之前没有IT或者project经验的同学也可以轻轻松松顺利拿下&#xff0c;含金量很高可以直接标到linkedln的个人介绍里面。 (1)将如何帮助职业生涯 获得此认证可验证对 AWS Cloud、服务和…

Linux内核有什么之内存管理子系统有什么——基础篇之struct vm_area_struct(2)

接前一篇文章&#xff1a;Linux内核有什么之内存管理子系统有什么——基础篇之struct vm_area_struct&#xff08;1&#xff09; 本文内容参考&#xff1a; linux进程虚拟地址空间 《趣谈Linux操作系统 核心原理篇&#xff1a;第四部分 内存管理—— 刘超》 4.6 深入理解 Li…

创新S3存储桶检索:Langchain社区S3加载器搭载OpenAI API

在瞬息万变的数据存储和处理领域&#xff0c;将高效的云存储解决方案与先进的 AI 功能相结合&#xff0c;为处理大量数据提供了一种变革性的方法。本文演示了使用 MinIO、Langchain 和 OpenAI 的 GPT-3.5 模型的实际实现&#xff0c;重点总结了存储在 MinIO 存储桶中的文档。 …

Linux基础-1

Linux基础 内核exp利用 kernel 2.6.32 版本相对来说比较安全&#xff01; 系统命令 Vi编辑器 vi编辑器有三种模式&#xff01; 命令模式、插入模式、底行模式 ​ 命令模式&#xff1a;输入一些命令对文本进行操控 gg:回到文首 G:进入文本尾部 dd : 删除光标所在行&…

Unity Meta Quest MR 开发(四):使用 Scene API 和 Depth API 实现深度识别和环境遮挡

文章目录 &#x1f4d5;教程说明&#x1f4d5;Scene API 实现遮挡&#x1f4d5;Scene API 实现遮挡的缺点&#x1f4d5;Depth API 实现遮挡⭐导入 Depth API⭐修改环境配置⭐添加 EnvironmentDepthOcclusion 预制体⭐给物体替换遮挡 Shader⭐取消现实手部的遮挡效果 此教程相关…

Java微服务学习Day1

文章目录 认识微服务服务拆分及远程调用服务拆分服务远程调用提供者与消费者 Eureka注册中心介绍构建EurekaServer注册user-serviceorder-service完成服务拉取 Ribbon负载均衡介绍原理策略饥饿加载 Nacos注册中心介绍配置分级存储负载均衡环境隔离nacos注册中心原理 认识微服务…