2025年大一ACM训练-搜索

2025年大一ACM训练-搜索

前期知识:DFS,本文搜索题解法以深度优先搜索为主
1.1 DFS 的定义
深度优先搜索(Depth-First Search)是一种用于遍历树或图的算法。核心思想是尽可能“深入”访问图的每个节点,直到无法继续前进为止,然后再回溯到之前的节点继续遍历。

1.2 DFS 的工作原理
DFS 的基本步骤如下:

  1. 访问当前节点:从起点节点开始访问。
  2. 递归遍历子节点:依次访问当前节点的所有未被访问过的子节点。
  3. 回溯:当所有子节点都被访问完毕后,回溯到父节点继续遍历。

1.3 DFS 的典型应用场景
迷宫求解:寻找从起点到终点的路径。
连通性问题:判断图中的两个节点是否连通。
路径查找:在图中查找从一个节点到另一个节点的所有可能路径。
DFS主要以栈结构或递归来实现,递归本质上也是栈结构的运用

读者可通过以下视频进行初步学习

图的算法-DFS深度优先遍历搜索算法 数据结构与算法

Problem A 迷宫寻路-搜索:这里是引用

#include<bits/stdc++.h>
using namespace std;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char a[1001][1001];
int posx[2],posy[2],n,m;
void dfs(int x,int y)
{a[x][y]='#';int x1,y1,i;for(i=0;i<4;i++){x1=x+dir[i][0];y1=y+dir[i][1];if(x1>=0 && x1<n && y1>=0 && y1<m && a[x1][y1]=='*'){dfs(x1,y1);}}
}
int main()
{int i,j;while(cin>>n>>m){int p=-1;for(i=0;i<n;i++){for(j=0;j<m;j++){cin>>a[i][j];if((i==0 || i==n-1 || j==0 || j==m-1) &&a[i][j]=='*'){posx[++p]=i;posy[p]=j;}}}dfs(posx[0],posy[0]);if(a[posx[1]][posy[1]]=='#') cout<<"YES"<<endl;else cout<<"NO"<<endl;}return 0;
}

从代码里可以看出几个关键部分:
①对于迷宫问题,对开始点和结束点的确定是必要部分
②在dfs函数内(x,y)点要朝上下左右四个方向移动,用dir数组来实现简化
③判断边界
④对于已经访问过的节点要标记,防止陷入死循环

Problem B 白与黑-搜索:
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;int graph[21][21];
int w, h, startX, startY, cnt = 0;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
void dfs(int x, int y)
{graph[x][y] = 0;cnt++;for (int i = 0; i < 4; i++){int nx = x + dx[i];int ny = y + dy[i];if (nx >= 1 && nx <= w && ny >= 1 && ny <= h && graph[nx][ny] == 1){dfs(nx, ny);}}
}int main() {while (cin >> w >> h && w && h){memset(graph, 0, sizeof(graph));cnt = 0;for (int i = 1; i <= h; i++) {for (int j = 1; j <= w; j++) {char ch;cin >> ch;if (ch == '#') graph[j][i] = 0;else if (ch == '.') graph[j][i] = 1;else if (ch == '@') {startX = j;startY = i;graph[j][i] = 1;}}}dfs(startX, startY);cout << cnt << endl;}return 0;
}

Problem C 搜索入门-搜索:
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
char a[5][5];
void dfs(int x,int y)
{a[x][y]='*';int x1,y1,i;for(i=0;i<4;i++){x1=x+dir[i][0];y1=y+dir[i][1];if(x1>=0 && x1<4 && y1>=0 && y1<4 && a[x1][y1]=='#'){dfs(x1,y1);}}
}
int main()
{int n,i,j;cin>>n;while(n--){for(i=0;i<4;i++)for(j=0;j<4;j++) cin>>a[i][j];dfs(0,0);if(a[3][3]=='*') cout<<"YES"<<endl;else cout<<"NO"<<endl;}
}

Problem D 逃出迷宫-搜索:
在这里插入图片描述

这题和其他几个有所不同,用的是BFS,具体不在本文阐述

#include<bits/stdc++.h>
#define MAX_R 1000
#define MAX_C 1000
#define INF INT_MAX
typedef struct {int x, y;int time;
} Position;
typedef struct {int x, y;
} Fire;
char maze[MAX_R][MAX_C];
int dist[MAX_R][MAX_C];
int fire_dist[MAX_R][MAX_C];
Position queue[MAX_R * MAX_C];
Fire fire_queue[MAX_R * MAX_C];
int front,rear,fire_front,fire_rear,R,C;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
void bfs_fire()
{fire_front=fire_rear=0;for (int i=0;i<R;i++){for (int j=0;j<C;j++){if (maze[i][j]=='F'){fire_queue[fire_rear].x=i;fire_queue[fire_rear].y=j;fire_rear++;fire_dist[i][j] = 0;}else fire_dist[i][j] = INF;}}while (fire_front<fire_rear){Fire current=fire_queue[fire_front];fire_front++;for (int i=0;i<4;i++){int nx = current.x + dx[i];int ny = current.y + dy[i];if (nx >= 0 && nx < R && ny >= 0 && ny < C && maze[nx][ny] != '#' && fire_dist[nx][ny] == INF) {fire_dist[nx][ny] = fire_dist[current.x][current.y] + 1;fire_queue[fire_rear].x = nx;fire_queue[fire_rear].y = ny;fire_rear++;}}}
}
int bfs_joe() {int start_x = -1, start_y = -1;for (int i = 0; i < R; i++){for (int j = 0; j < C; j++){if (maze[i][j] == 'J'){start_x = i;start_y = j;break;}}if (start_x != -1) break;}front = rear = 0;queue[rear].x = start_x;queue[rear].y = start_y;queue[rear].time = 0;rear++;dist[start_x][start_y] = 0;while (front < rear){Position current = queue[front];front++;for (int i = 0; i < 4; i++){int nx = current.x + dx[i];int ny = current.y + dy[i];if (nx < 0 || nx >= R || ny < 0 || ny >= C)return current.time + 1;if (nx >= 0 && nx < R && ny >= 0 && ny < C && maze[nx][ny] != '#' && dist[nx][ny] == -1 && (current.time + 1 < fire_dist[nx][ny] || fire_dist[nx][ny] == INF)){dist[nx][ny] = current.time + 1;queue[rear].x = nx;queue[rear].y = ny;queue[rear].time = current.time + 1;rear++;}}}return -1;
}
int main()
{int T;cin>>T:while (T--){cin>>R>>C;for (int i=0;i<R;i++) cin>>maze[i];bfs_fire();memset(dist, -1, sizeof(dist));int result = bfs_joe();if (result == -1) cout<<"IMPOSSIBLE"<<endl;else cout<<result<<endl;}return 0;
}

Problem E 林大超市买水果-搜索:
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
int M, N, K;
int prices[31];
bool found = false;
void dfs(int start,int count,int sum)
{if (found) return;if (count == K){if (sum == M){found = true;}return;}for (int i=start;i<N;i++){if (sum+prices[i]>M) continue;dfs(i+1,count+1,sum+prices[i]);}
}
int main()
{cin>>M>>N>>K;for (int i = 0; i < N; i++)cin>>prices[i];dfs(0,0,0);if (found) printf("Yes\n");else printf("No\n");return 0;
}

Problem F 瓷砖-搜索:
在这里插入图片描述

#include <bits/stdc++.h>
using namespace std;int graph[51][51];
int w, h, startX, startY, cnt = 0;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, -1, 0, 1};
void dfs(int x, int y)
{graph[x][y] = 0;cnt++;for (int i = 0; i < 4; i++){int nx = x + dx[i];int ny = y + dy[i];if (nx >= 1 && nx <= w && ny >= 1 && ny <= h && graph[nx][ny] == 1){dfs(nx, ny);}}
}int main()
{while (cin >> w >> h && w && h){memset(graph, 0, sizeof(graph));cnt = 0;for (int i = 1; i <= h; i++) {for (int j = 1; j <= w; j++) {char ch;cin >> ch;if (ch == '#') graph[j][i] = 0;else if (ch == '.') graph[j][i] = 1;else if (ch == '@'){startX = j;startY = i;graph[j][i] = 1;}}}dfs(startX,startY);cout<<cnt<<endl;}return 0;
}

Problem G 最大黑色区域-搜索:
在这里插入图片描述

#include<bits/stdc++.h> 
using namespace std;
int n,m,ans=1,mmax;
char mapc[105][105];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void dfs(int x0, int y0)
{for (int i=0;i<4;i++){int x =x0+dir[i][0];int y =y0+dir[i][1];if (mapc[x][y] == '1'){mapc[x][y] = '0';ans++;dfs(x, y);}}
}int main()
{cin>>n>>m;for (int i=1;i<=n;i++){for (int j=1;j<=m;j++)cin>>mapc[i][j];}for (int i=1;i<=n;i++){for (int j=1;j<=m;j++){if (mapc[i][j] == '1'){mapc[i][j]='0';dfs(i,j);mmax=max(mmax,ans);ans = 1;}}}cout << mmax << endl;return 0;
}

Problem H 猴群-搜索:
在这里插入图片描述

#include<bits/stdc++.h> 
using namespace std;
int n, m, ans = 0;
char mapc[105][105];
int dir[4][2] = {{1,0}, {-1,0}, {0,1}, {0,-1}};void dfs(int x, int y)
{for (int i = 0; i < 4; i++){int nx = x + dir[i][0];int ny = y + dir[i][1];if (nx>=1 && nx<=n && ny>=1 && ny<=m && mapc[nx][ny]!='0'){mapc[nx][ny] = '0';dfs(nx,ny);}}
}int main()
{cin >> n >> m;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++)cin >> mapc[i][j];}for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (mapc[i][j] != '0'){ans++;dfs(i,j);}}}cout << ans<<endl;return 0;
}

总体来说除D题是BFS算法,E题不是迷宫问题,其余均是基本的DFS迷宫题型,代码容易且相似。

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

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

相关文章

Nginx核心功能02

目录 一&#xff0c;正向代理 1&#xff0c;编译安装Nginx &#xff08;1&#xff09;安装支持软件 &#xff08;2&#xff09;创建运行用户&#xff0c;组和日志目录 &#xff08;3&#xff09;编译安装Nginx &#xff08;4&#xff09;添加Nginx系统服务 2&#xff0c…

rk3568安全启动功能实践

本文主要讲述笔者在rk3568芯片上开发安全启动功能实践的流程。其中主要参考瑞芯微官方文档《Rockchip_Developer_Guide_Secure_Boot_for_UBoot_Next_Dev_CN.pdf》。文档中描述逻辑不是很清晰而且和当前瑞芯微的sdk中安全启动的流程匹配度不高。本文就不再对瑞芯微官方文档的内容…

[操作系统] 线程互斥

文章目录 背景概念线程互斥的引出互斥量锁的操作初始化 (Initialization)静态初始化动态初始化 加锁 (Locking)阻塞式加锁非阻塞式加锁 (尝试加锁/一般不考虑) 解锁 (Unlocking)销毁 (Destruction)设置属性 (Setting Attributes - 通过 pthread_mutex_init) 锁本身的保护互斥锁…

【神经网络与深度学习】两种加载 pickle 文件方式(joblib、pickle)的差异

引言 从深度学习应用到数据分析的多元化需求出发&#xff0c;Python 提供了丰富的工具和模块&#xff0c;其中 pickle 和 joblib 两种方式在加载数据文件方面表现尤为突出。不同场景对性能、兼容性以及后续处理的要求不尽相同&#xff0c;使得这两种方式各显优势。本文将通过深…

Electron 入门指南

Electron 入门指南 Electron 是一个使用 JavaScript、HTML 和 CSS 构建跨平台桌面应用的框架。通过 Electron&#xff0c;你可以利用 Web 技术开发出功能强大的桌面应用程序&#xff0c;并且能够运行在 Windows、Mac 和 Linux 系统上。 本文将带你从零开始构建一个简单的 Ele…

编程中如何与AI交互-结构化输入和理解确认机制

一 结构化输入是什么 &#x1f4cc; 结构化输入的定义&#xff1a; 结构化输入是指以清晰、分层、有逻辑的格式向 AI 输入信息&#xff0c;使其更容易解析内容、抓住重点&#xff0c;并准确回答问题。 &#x1f4e6; 举个例子&#xff08;编程场景&#xff09;&#xff1a; 非…

13:傅里叶变换

傅立叶变换(FT, Fourier Transform)的作用是将一个信号由时域变换到频域。其实就是把数据由横坐标时间、纵坐标采样值的波形图格式&#xff0c;转换为横坐标频率、纵坐标振幅(或相位)的频谱格式。换后可以很明显地看出一些原先不易察觉的特征。 有些信号在时域上是很难看出什么…

基于单片机的音频信号处理系统设计(一)

项目名称:基于单片机的音频信号处理系统设计学院名称:信息学院学生姓名:学号专业年级:指导教师:教师职称:教授企业导师:目 录 摘 要 Abstract 1 前言 1.1研究背景与意义 <

机器学习实操 第一部分 机器学习基础 第8章 降维技术

机器学习实操 第一部分 机器学习基础 第8章 降维技术 内容概要 第8章探讨了降维技术&#xff0c;这些技术在处理高维数据时至关重要。高维数据不仅会使训练过程变得极其缓慢&#xff0c;还会增加找到良好解决方案的难度&#xff0c;这就是所谓的维度灾难问题。幸运的是&#…

微信小程序 XSS 防护知识整理

场景1&#xff1a;用户输入表单&#xff08;如评论框&#xff09; 错误做法&#xff1a;直接渲染未过滤的用户输入 // WXML <view>{{ userInput }}</view>// JS&#xff08;用户输入了恶意内容&#xff09; Page({data: { userInput: <script>alert("…

MySQL 服务搭建

&#x1f4a2;欢迎来到张翊尘的开源技术站 &#x1f4a5;开源如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 在线安装Ubuntu/Debian更新系统包索引安装 MySQL …

【Java面试笔记:进阶】23.请介绍类加载过程,什么是双亲委派模型?

Java的类加载机制是JVM的核心组成部分,其过程分为三个阶段,并采用双亲委派模型来保证类加载的安全性和一致性。 1.类加载过程 1.加载阶段(Loading) 核心任务:查找并加载类的二进制字节流(如.class文件)。具体行为: 将字节码数据从不同数据源(如文件系统、网络等)读…

UN R79 关于车辆转向装置形式认证的统一规定(正文部分1)

UN R79法规是针对转向装置的型式认证法规&#xff0c;涉及A/B1/C类的横向控制辅助驾驶功能&#xff0c;对各功能的功能边界、性能要求、状态提示、故障警示以及型式认证要提交的信息做了规范&#xff0c;本文结合百度文心一言对法规进行翻译&#xff0c;并结合个人理解对部分内…

[随笔] 升级uniapp旧项目的vue、pinia、vite、dcloudio依赖包等

汇总 # 升级uniapp项目dcloudio整体依赖&#xff0c;建议执行多次 # 会顺带自动更新/升级vue的版本 npx dcloudio/uvmlatest alpha# 检查 pinia 的最新版本 npm view pinia version# 更新项目 pinia 到最新版本 npm update pinia# 更新项目 pinia 到特定的版本 # 首先&#xf…

【使用小皮面板 + WordPress 搭建本地网站教程】

&#x1f680; 使用小皮面板 WordPress 搭建本地网站教程&#xff08;快速上手&#xff09; 本教程将手把手教你如何使用 小皮面板&#xff08;XAMPP 类似工具&#xff09; 和 WordPress 搭建一个完全本地化的网站环境。适合 初学者 / 博主 / Web开发者 本地练习使用&#xf…

[更新完毕]2025五一杯A题五一杯数学建模思路代码文章教学:支路车流量推测问题

完整内容请看文章最下面的推广群 支路车流量推测问题 摘要 本文针对支路车流量推测问题展开研究&#xff0c;通过建立数学模型解决不同场景下的车流量分析需求。 针对问题一&#xff08;Y型道路场景&#xff09;&#xff0c;研究两支路汇入主路的车流量推测。通过建立线性增长…

前端面试宝典---webpack原理解析,并有简化版源码

前言 先看一下webpack打包后的bundle.js&#xff0c;前边的直接扫一眼就过&#xff0c;可以发现这个立即执行函数的形参就是一个&#xff0c;key为引入文件路径&#xff0c;value为该模块代码的函数。 所以比较重要的就是通过webpack的配置文件中的entry的入口文件&#xff0c…

面试的各种类型

面试是用人单位选拔人才的重要环节&#xff0c;常见的面试类型有结构化面试、半结构化面试、非结构化面试和压力面试&#xff0c;每种类型都有其特点和应对策略。 一、结构化面试 特点&#xff1a; 标准化流程 面试流程固定&#xff0c;考官会按照预先设计好的问题清单依次向…

vue3定义全局防抖指令

文章目录 代码参数讲解 在写项目时&#xff0c;总会有要进行防抖节流的时候&#xff0c;如果写一个debounce函数的话 用起来代码总会是有点长的&#xff0c;因此想到了用一个全局指令进行输入框的防抖&#xff0c;毕竟全局指令使用时只要v-xxx就行了&#xff0c;非常方便 代码…

WebDeveloper 流量分析、sudo提权,靶场通关WP

一、信息收集 1、主机探测 arp-scan -l netdiscover -i eth0 -r 192.168.33.0/24 nmap -sP 192.168.66.0/24 2、端口扫描 nmap -sS -sV 192.168.66.141 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) 80/tcp op…