当前位置: 首页 > wzjs >正文

北京网站开开发公司电话免费企业网站建设单位

北京网站开开发公司电话,免费企业网站建设单位,网站搭建工作,海外营销网站建设2025年大一ACM训练-搜索 前期知识:DFS,本文搜索题解法以深度优先搜索为主 1.1 DFS 的定义 深度优先搜索(Depth-First Search)是一种用于遍历树或图的算法。核心思想是尽可能“深入”访问图的每个节点,直到无法继续前进…

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.dtcms.com/wzjs/828585.html

相关文章:

  • 中文网站的seo怎么做中色冶金建设有限公司网站
  • 在小说网站做责编免费咨询合同
  • 昆明网站搭建多少钱网站开发平台及常用的开发工具
  • 营销网站建设方案一个完整的网址包含哪些内容
  • 泰安做网站万网域名注册流程
  • 怎么联系网站开发团队江门建站网站模板
  • 中山响应式网站如何优选网站建设公司
  • 大良网站制作利用电脑做网站
  • 安卓做视频网站好html 门户网站模板
  • 建设银行申请信用卡网站做淘宝客为什么要做网站
  • wordpress关闭文章摘要安徽建站优化哪里有
  • 邢台公司做网站多少钱商业软文怎么写
  • 网站禁止被采集最挣钱没人干的生意
  • 韩国学校网站模板中国建筑人才网官方网
  • 网站建设注意细节问题wordpress 幻燈片 插件
  • 西安西郊网站建设2022年列入传销组织最新骗法
  • 怎样电脑登录网站网站建设与制作过程
  • 西安公司建设网站无忧网站建设价格
  • 怀远县建设局网站上海广告投放公司
  • 网站怎样做外链品牌推广服务
  • 用Wordpress建的网站有做网站虚拟主机配置
  • js验证网站网站优化百度
  • 网红助手24小时自助下单app性价比高的seo网站优化
  • 漳州港建设规划局网站wordpress改不了语言
  • 一级域名建站网站建设行吗sem竞价推广代运营
  • 网站建设项目可行性分析报告做网站要什么资料
  • asp网站版权万州区建设局官方网站
  • 医院网站建设企业wordpress页眉内容修改
  • 电子商务 网站模板响应式布局优缺点
  • 试用型网站wordpress主题4mudi