【算法笔记自学】第 8 章 提高篇(2)——搜索专题

8.1深度优先搜索(DFS)

#include <cstdio>const int MAXN = 5;
int n, m, maze[MAXN][MAXN];
bool visited[MAXN][MAXN] = {false};
int counter = 0;const int MAXD = 4;
int dx[MAXD] = {0, 0, 1, -1};
int dy[MAXD] = {1, -1, 0, 0};bool isValid(int x, int y) {return x >= 0 && x < n && y >= 0 && y < m && maze[x][y] == 0 && !visited[x][y];
}void DFS(int x, int y) {if (x == n - 1 && y == m - 1) {counter++;return;}visited[x][y] = true;for (int i = 0; i < MAXD; i++) {int nextX = x + dx[i];int nextY = y + dy[i];if (isValid(nextX, nextY)) {DFS(nextX, nextY);}}visited[x][y] = false;
}int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &maze[i][j]);}}DFS(0, 0);printf("%d", counter);return 0;
}

#include <cstdio>const int MAXN = 5;
int n, m, k, maze[MAXN][MAXN];
bool visited[MAXN][MAXN] = {false};
bool canReach = false;const int MAXD = 4;
int dx[MAXD] = {0, 0, 1, -1};
int dy[MAXD] = {1, -1, 0, 0};bool isValid(int x, int y) {return x >= 0 && x < n && y >= 0 && y < m && maze[x][y] == 0 && !visited[x][y];
}void DFS(int x, int y, int step) {if (canReach) {return;}if (x == n - 1 && y == m - 1) {if (step == k) {canReach = true;}return;}visited[x][y] = true;for (int i = 0; i < MAXD; i++) {int nextX = x + dx[i];int nextY = y + dy[i];if (step < k && isValid(nextX, nextY)) {DFS(nextX, nextY, step + 1);}}visited[x][y] = false;
}int main() {scanf("%d%d%d", &n, &m, &k);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &maze[i][j]);}}DFS(0, 0, 0);printf(canReach ? "Yes" : "No");return 0;
}

#include <cstdio>const int MAXN = 5;
const int INF = 0x3f3f3f3f;
int n, m, maze[MAXN][MAXN];
bool visited[MAXN][MAXN] = {false};
int maxValue = -INF;const int MAXD = 4;
int dx[MAXD] = {0, 0, 1, -1};
int dy[MAXD] = {1, -1, 0, 0};bool isValid(int x, int y) {return x >= 0 && x < n && y >= 0 && y < m && !visited[x][y];
}void DFS(int x, int y, int nowValue) {if (x == n - 1 && y == m - 1) {if (nowValue > maxValue) {maxValue = nowValue;}return;}visited[x][y] = true;for (int i = 0; i < MAXD; i++) {int nextX = x + dx[i];int nextY = y + dy[i];if (isValid(nextX, nextY)) {int nextValue = nowValue + maze[nextX][nextY];DFS(nextX, nextY, nextValue);}}visited[x][y] = false;
}int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &maze[i][j]);}}DFS(0, 0, maze[0][0]);printf("%d", maxValue);return 0;
}

#include <cstdio>
#include <vector>
#include <utility>
using namespace std;typedef pair<int, int> Position;const int MAXN = 5;
const int INF = 0x3f;
int n, m, maze[MAXN][MAXN];
bool visited[MAXN][MAXN] = {false};
int maxValue = -INF;
vector<Position> tempPath, optPath;const int MAXD = 4;
int dx[MAXD] = {0, 0, 1, -1};
int dy[MAXD] = {1, -1, 0, 0};bool isValid(int x, int y) {return x >= 0 && x < n && y >= 0 && y < m && !visited[x][y];
}void DFS(int x, int y, int nowValue) {if (x == n - 1 && y == m - 1) {if (nowValue > maxValue) {maxValue = nowValue;optPath = tempPath;}return;}visited[x][y] = true;for (int i = 0; i < MAXD; i++) {int nextX = x + dx[i];int nextY = y + dy[i];if (isValid(nextX, nextY)) {int nextValue = nowValue + maze[nextX][nextY];tempPath.push_back(Position(nextX, nextY));DFS(nextX, nextY, nextValue);tempPath.pop_back();}}visited[x][y] = false;
}int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &maze[i][j]);}}tempPath.push_back(Position(0, 0));DFS(0, 0, maze[0][0]);for (int i = 0; i < optPath.size(); i++) {printf("%d %d\n", optPath[i].first + 1, optPath[i].second + 1);}return 0;
}

#include <cstdio>const int MAXN = 5;
const int INF = 0x3f;
int n, m, maze[MAXN][MAXN], isWall[MAXN][MAXN];
bool visited[MAXN][MAXN] = {false};
int maxValue = -INF;const int MAXD = 4;
int dx[MAXD] = {0, 0, 1, -1};
int dy[MAXD] = {1, -1, 0, 0};bool isValid(int x, int y) {return x >= 0 && x < n && y >= 0 && y < m && !isWall[x][y] && !visited[x][y];
}void DFS(int x, int y, int nowValue) {if (x == n - 1 && y == m - 1) {if (nowValue > maxValue) {maxValue = nowValue;}return;}visited[x][y] = true;for (int i = 0; i < MAXD; i++) {int nextX = x + dx[i];int nextY = y + dy[i];if (isValid(nextX, nextY)) {int nextValue = nowValue + maze[nextX][nextY];DFS(nextX, nextY, nextValue);}}visited[x][y] = false;
}int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &isWall[i][j]);}}for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &maze[i][j]);}}DFS(0, 0, maze[0][0]);printf("%d", maxValue);return 0;
}

8.2广度优先搜索(BFS)

 

#include <cstdio>
#include <queue>
using namespace std;const int MAXN = 100000;
bool inQueue[MAXN + 1] = {false};int getStep(int n) {int step = 0;queue<int> q;q.push(1);while (true) {int cnt = q.size();for (int i = 0; i < cnt; i++) {int front = q.front();q.pop();if (front == n) {return step;}inQueue[front] = true;if (front * 2 <= n && !inQueue[front * 2]) {q.push(front * 2);}if (front + 1 <= n && !inQueue[front + 1]) {q.push(front + 1);}}step++;}
}int main() {int n, step = 0;scanf("%d", &n);printf("%d", getStep(n));return 0;
}

#include <cstdio>
#include <queue>
#include <utility>
using namespace std;typedef pair<int, int> Position;const int MAXN = 100;
int n, m, matrix[MAXN][MAXN];
bool inQueue[MAXN][MAXN] = {false};const int MAXD = 4;
int dx[MAXD] = {0, 0, 1, -1};
int dy[MAXD] = {1, -1, 0, 0};bool canVisit(int x, int y) {return x >= 0 && x < n && y >= 0 && y < m && matrix[x][y] == 1 && !inQueue[x][y];
}void BFS(int x, int y) {queue<Position> q;q.push(Position(x, y));inQueue[x][y] = true;while (!q.empty()) {Position front = q.front();q.pop();for (int i = 0; i < MAXD; i++) {int nextX = front.first + dx[i];int nextY = front.second + dy[i];if (canVisit(nextX, nextY)) {inQueue[nextX][nextY] = true;q.push(Position(nextX, nextY));}}}
}int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &matrix[i][j]);}}int counter = 0;for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {if (matrix[i][j] == 1 && !inQueue[i][j]) {BFS(i, j);counter++;}}}printf("%d", counter);return 0;
}

#include <cstdio>
#include <queue>
#include <utility>
using namespace std;typedef pair<int, int> Position;const int MAXN = 100;
int n, m, maze[MAXN][MAXN];
bool inQueue[MAXN][MAXN] = {false};const int MAXD = 4;
int dx[MAXD] = {0, 0, 1, -1};
int dy[MAXD] = {1, -1, 0, 0};bool canVisit(int x, int y) {return x >= 0 && x < n && y >= 0 && y < m && maze[x][y] == 0 && !inQueue[x][y];
}int BFS(int x, int y) {queue<Position> q;q.push(Position(x, y));inQueue[x][y] = true;int step = 0;while (!q.empty()) {int cnt = q.size();while (cnt--) {Position front = q.front();q.pop();if (front.first == n - 1 && front.second == m - 1) {return step;}for (int i = 0; i < MAXD; i++) {int nextX = front.first + dx[i];int nextY = front.second + dy[i];if (canVisit(nextX, nextY)) {inQueue[nextX][nextY] = true;q.push(Position(nextX, nextY));}}}step++;}return -1;
}int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &maze[i][j]);}}int step = BFS(0, 0);printf("%d", step);return 0;
}

#include <cstdio>
#include <queue>
#include <utility>
#include <algorithm>
using namespace std;typedef pair<int, int> Position;const int MAXN = 100;
int n, m, maze[MAXN][MAXN];
bool inQueue[MAXN][MAXN] = {false};
Position pre[MAXN][MAXN];const int MAXD = 4;
int dx[MAXD] = {0, 0, 1, -1};
int dy[MAXD] = {1, -1, 0, 0};bool canVisit(int x, int y) {return x >= 0 && x < n && y >= 0 && y < m && maze[x][y] == 0 && !inQueue[x][y];
}void BFS(int x, int y) {queue<Position> q;q.push(Position(x, y));inQueue[x][y] = true;while (!q.empty()) {Position front = q.front();q.pop();if (front.first == n - 1 && front.second == m - 1) {return;}for (int i = 0; i < MAXD; i++) {int nextX = front.first + dx[i];int nextY = front.second + dy[i];if (canVisit(nextX, nextY)) {pre[nextX][nextY] = Position(front.first, front.second);inQueue[nextX][nextY] = true;q.push(Position(nextX, nextY));}}}
}void printPath(Position p) {Position prePosition = pre[p.first][p.second];if (prePosition == Position(-1, -1)) {printf("%d %d\n", p.first + 1, p.second + 1);return;}printPath(prePosition);printf("%d %d\n", p.first + 1, p.second + 1);
}int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {scanf("%d", &maze[i][j]);}}fill(pre[0], pre[0] + n * m, Position(-1, -1));BFS(0, 0);printPath(Position(n - 1, m - 1));return 0;
}

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

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

相关文章

【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【21】【购物车】

持续学习&持续更新中… 守破离 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【21】【购物车】 购物车需求描述购物车数据结构数据Model抽取实现流程&#xff08;参照京东&#xff09;代码实现参考 购物车需求描述 用户可以在登录状态下将商品添加到购物车【用户购物…

CSS技巧:纯CSS实现文字渐变动画效果

文字渐变动画&#xff0c;可以实现的有两种&#xff1a;一种是一行文字整体变化颜色&#xff1b;另一种一行文字依次变化颜色。接下来&#xff0c;我就介绍一下这两种文字渐变的实现过程。 布局代码&#xff1a; <div class"con"><div class"animate…

7.pwn 工具安装和使用

关闭保护的方法 pie: -no-pie Canary:-fno-stack-protector aslr:查看:cat /proc/sys/kernel/randomize_va_space 2表示打开 关闭:echo 0>/proc/sys/kernel/randomize_va_space NX:-z execstack gdb使用以及插件安装 是GNU软件系统中的标准调试工具&#xff0c;此外GD…

electron 初始使用

electron electron文档地址deno下载地址安装命令 yarn config set electron_mirror https://cdn.npm.taobao.org/dist/electron/ npm install下载文件 文件下载完成后&#xff0c;新建dist目录&#xff0c;解压到list目录下&#xff1b;path文件中写入electron.exe 运行命令 …

排序格式排序格式

排序格式排序格式

P5. 微服务: Bot代码的执行

P5. 微服务: Bot代码的执行 0 概述1 Bot代码执行框架2 Bot代码传递给BotRunningSystem3 微服务: Bot代码执行的实现逻辑3.1 整体微服务逻辑概述3.2 生产者消费者模型实现3.3 consume() 执行代码函数的实现3.4 执行结果返回给 nextStep 4 扩展4.1 Bot代码的语言 0 概述 本章介绍…

Vulnhub靶场DC-5练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 利用burpsuite爆破文件包含的参数2. 文件包含3. nginx日志挂马4. 反弹shell5.漏洞利用和提权 0x04 总结 0x00 准备 下载链接&#xff1a;https://download.vulnhub.com/dc/DC-5.zip 介绍&#xff1a; …

kafka-3

Kafka 消费组 consumer-offsets-N 稀疏索引 Kafka集群 集群搭建 集群启动和验证 Topic的意义 Topic和Partition 分区 副本 集群操作指令 多分区&多副本 多分区消费组 Rebalance机制 Rebalance机制处理流程 Rebalance机制-Range Rebalance机制-RoudRobin Rebalance机制-St…

计数排序的实现

原理 对一个数组进行遍历&#xff0c;再创建一个count数组 每找到一个值则在count数组中对应的位置加一&#xff0c;再在count数组中找到数字上方的count值&#xff0c;count值为几&#xff0c;则打印几次数组中的值. 开空间 相对映射 排序的实现 void CountSort(int* a, i…

PageHelper分页查询遇到的小问题

如果我们是这样子直接查询 pagehelper会拼接导我们的sql语句之后 这样子我们搜索出来的list&#xff0c;就是里面参杂了PageHelper的东西 所以我们可以直接转成我们的Page类型 但是如果我们搜索出来的是List<Blog>&#xff0c;我有些信息不想返回给前端&#xff0c;所以…

mac M1安装 VSCode

最近在学黑马程序员Java最新AI若依框架项目开发&#xff0c;里面前端用的是Visual Studio Code 所以我也就下载安装了一下&#xff0c;系统是M1芯片的&#xff0c;安装过程还是有点坑的写下来大家注意一下 1.在appstore中下载 2.在系统终端中输入 clang 显示如下图 那么在终端输…

C++语言相关的常见面试题目(一)

1. const关键字的作用 答&#xff1a; 省流&#xff1a;&#xff08;1&#xff09;定义变量&#xff0c;主要为了防止修改 (2) 修饰函数参数&#xff1a;防止在函数内被改变 &#xff08;3&#xff09;修饰函数的返回值 &#xff08;4&#xff09;修饰类中的成员函数 2. Sta…

并发编程-05AQS原理

并发编程-深入理解AQS之ReentrantLock 一 认识AQS 在讲解AQS原理以及相关同步器之前&#xff0c;我们需要对AQS有一些基本的认识&#xff0c;了解下它有什么样的机制&#xff0c;这样追踪源码的时候就不会太过于迷茫&#xff01; 1.1 什么是AQS java.util.concurrent包中的大…

LabVIEW与OpenCV图像处理对比

LabVIEW和OpenCV在图像处理方面各有特点。LabVIEW擅长图形化编程、实时处理和硬件集成&#xff0c;而OpenCV则提供丰富的算法和多语言支持。通过DLL、Python节点等方式&#xff0c;OpenCV的功能可在LabVIEW中实现。本文将结合具体案例详细分析两者的特点及实现方法。 LabVIEW与…

某大会的影响力正在扩大,吞噬了整个数据库世界!

1.规模空前 你是否曾被那句“上有天堂&#xff0c;下有苏杭”所打动&#xff0c;对杭州的湖光山色心驰神往&#xff1f;7月&#xff0c;正是夏意正浓的时节&#xff0c;也是游览杭州的最佳时期。这座古典与现代交融的城市将迎来了第13届PostgreSQL中国技术大会。作为全球数据库…

LabVIEW从测试曲线中提取特征值

在LabVIEW中开发用于从测试曲线中提取特征值的功能时&#xff0c;可以考虑以下几点&#xff1a; 数据采集与处理&#xff1a; 确保你能够有效地采集和处理测试曲线数据。这可能涉及使用DAQ模块或其他数据采集设备来获取曲线数据&#xff0c;并在LabVIEW中进行处理和分析。 特…

系统级别的原生弹窗窗口

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>原生的弹出窗口dialog</title><style>…

【TB作品】51单片机 Proteus仿真 基于单片机的LCD12864万年历及温度监测系统设计

实验报告&#xff1a;基于单片机的LCD12864万年历及温度监测系统设计 背景介绍 本实验旨在设计并实现一个基于STC89C52单片机的LCD12864显示的万年历系统&#xff0c;同时集成温度传感器以实现温度监测功能。系统具备整点报时和闹钟功能&#xff0c;通过蜂鸣器进行提示。该设…

初中物理知识点总结(人教版)

初中物理知识点大全 声现象知识归纳 1 .声音的发生&#xff1a;由物体的振动而产生。振动停止&#xff0c;发声也停止。 2.声音的传播&#xff1a;声音靠介质传播。真空不能传声。通常我们听到的声音是靠空气传来的。 3.声速&#xff1a;在空气中传播速度是&#xff1a;340…

【2024_CUMCM】T检验、F检验、卡方检验

T检验 T检验主要用于比较两组数据的均值差异&#xff0c;适用于小样本数据分析。它可以分为单样本T检验、独立样本T检验和配对样本T检验。 单样本T检验用于比较一个样本与已知的总体均值差异&#xff0c;独立样本T检验用于比较两个独立样本的均值差异&#xff0c;配对样本T检…