【vjudge训练记录】大一寒假专项训练——BFS

news/2025/2/13 18:10:08/文章来源:https://www.cnblogs.com/longxingx/p/18713813

训练情况

A题

BFS模板题,BFS需要开一个队列记录当前搜索到的坐标,每次从队头取出来一个往其他方向遍历,记得判断移动后的位置是否合法,马显然可以往八个方向走,我们先初始化步数为 -1,然后起点位置步数为 \(0\),每次移动时步数等于原来的地方步数 +1,直接记录步数即可

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
#define pii pair<int,int>using namespace std;const int N = 403;int n,m,x,y;
bool v[N][N];
int u[8][2] = {{-2,-1},{-2,1},{-1,-2},{-1,2},{1,-2},{1,2},{2,-1},{2,1}};
int ans[N][N];bool pd(int x,int y){return x>=1&&y>=1&&x<=n&&y<=m&&v[x][y]==0;
}void bfs(int stx,int sty){ans[stx][sty] = 0;queue<pii> q;q.push({stx,sty});while(q.size()){int x = q.front().first;int y = q.front().second;q.pop();if(v[x][y]) continue;v[x][y] = 1;for(int i = 0;i<8;i++){int xx = x + u[i][0];int yy = y + u[i][1];if(!pd(xx,yy)) continue;ans[xx][yy] = ans[x][y] + 1;q.push({xx,yy});}}
}void solve(){cin>>n>>m>>x>>y;for(int i = 1;i<=n;i++){for(int j = 1;j<=m;j++){ans[i][j] = -1;}}bfs(x,y);for(int i = 1;i<=n;i++){for(int j = 1;j<=m;j++){cout<<ans[i][j]<<" ";}cout<<endl;}
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

B题

这题还可以用并查集做,维护连通性再统计个数。BFS做法是遇到细胞就答案+1然后搜索,把相邻的细胞全部标记掉,如果遇到同一个细胞由于有标记就不会重复搜索

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
#define pii pair<int,int>using namespace std;const int N = 403;int n,m,x,y;
string s[N];
bool v[N][N];
int u[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
int ans;bool pd(int x,int y){return x>=0&&y>=0&&x<n&&y<m&&v[x][y]==0&&s[x][y]!='0';
}void bfs(int stx,int sty){queue<pii> q;q.push({stx,sty});while(q.size()){int x = q.front().first;int y = q.front().second;q.pop();if(v[x][y]) continue;v[x][y] = 1;for(int i = 0;i<4;i++){int xx = x + u[i][0];int yy = y + u[i][1];if(!pd(xx,yy)) continue;q.push({xx,yy});}}
}void solve(){cin>>n>>m;for(int i = 0;i<n;i++) cin>>s[i];for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){if(s[i][j] != '0' && !v[i][j]){ans++;bfs(i,j);}}}cout<<ans<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

C题

洪水是从边缘过来的,所以我们对矩阵的四条边进行BFS搜索,把相邻的 0 全部标记掉,遇到围墙过不去,最后全部遍历一遍,判断 0 的位置没有标记过就是洪水到不了的地方

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
#define pii pair<int,int>using namespace std;const int N = 403;int n,m,x,y;
string s[N];
bool v[N][N];
int u[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
int ans;bool pd(int x,int y){return x>=0&&y>=0&&x<n&&y<m&&v[x][y]==0&&s[x][y]=='0';
}void bfs(int stx,int sty){queue<pii> q;q.push({stx,sty});while(q.size()){int x = q.front().first;int y = q.front().second;q.pop();if(v[x][y]) continue;v[x][y] = 1;for(int i = 0;i<4;i++){int xx = x + u[i][0];int yy = y + u[i][1];if(!pd(xx,yy)) continue;q.push({xx,yy});}}
}void solve(){cin>>n>>m;for(int i = 0;i<n;i++) cin>>s[i];for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){if(i == 0 || i == n-1 || m == 0 || m == m-1){bfs(i,j);}}}for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){if(s[i][j] == '0' && !v[i][j]) ans++;}}cout<<ans<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

D题

这题我们需要观察到一个性质,无论如何走,三棱锥翻过的位置朝下的数字都是固定的,所以我们可以先处理能到的地方(三棱锥朝下的数字和给定的数字一样),之后进行 BFS 搜索求最短路即可

这题由于初始三棱锥的情况固定,所以我们通过手玩发现,对于奇数行朝下的数字一定是 4 3 2 1 4 3 2 1 这样的循环,对于偶数行朝下的数字一定是 1 2 3 4 1 2 3 4 这样的循环,我们预处理能到的地方,显然左右两侧都可以随便翻,由于三角形有尖头朝上和尖头朝下两种情况,所以对于奇数列可以往下走,偶数列可以往上走,BFS的方向数组在移动的时候需要注意一下即可,初始化答案为最大值,一旦能走到终点就更新答案取小值

点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
#define pii pair<int,int>using namespace std;const int N = 300;int n;
int a[N][N],b[N][N],step[N][N];
bool v[N][N];
bool vis[N][N];
int edx,edy;int u[4][2] = {{0,-1},{0,1},{1,1},{-1,-1}};int ans = INT_MAX;bool pd(int x,int y){return x>=1&&x<=n&&y>=1&&y<=(2*x-1);
}void bfs(int stx,int sty){queue<pii> q;q.push({stx,sty});while(q.size()){int x = q.front().first;int y = q.front().second;q.pop();if(x == edx && y == edy){ans = min(ans,step[x][y]);}if(vis[x][y] || !v[x][y]) continue;vis[x][y] = 1;for(int i = 0;i<4;i++){if(y%2==0 && i==2) continue;if(y%2==1 && i==3) continue;int xx = x + u[i][0];int yy = y + u[i][1];if(!pd(xx,yy) || !v[xx][yy]) continue;step[xx][yy] = step[x][y] + 1;q.push({xx,yy});}}
}void solve(){cin>>n;for(int i = 1;i<=n;i++){for(int j = 1;j<=2*i-1;j++){cin>>a[i][j];}}cin>>edx>>edy;for(int i = 1;i<=n;i++){for(int j = 1;j<=2*i-1;j++){if(i&1){int x = j-1; x%=4;b[i][j] = 4-x;} else {int x = j-1; x%=4;b[i][j] = x+1;}}}for(int i = 1;i<=n;i++){for(int j = 1;j<=2*i-1;j++){if(a[i][j] == b[i][j]) v[i][j] = 1;}}// for(int i = 1;i<=n;i++){//     for(int j = 1;j<=2*i-1;j++){//         cout<<v[i][j]<<" ";//     }//     cout<<endl;// }bfs(1,1);if(ans == INT_MAX) cout<<-1<<endl;else cout<<ans<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}

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

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

相关文章

包机制学习

包机制 但是操作过程中无法实现像视频里这样自动分出com kuang 这样的层级,视频输入的方法是com.kuang 然后回车就 自动生成下图红线线条画的上面两个层级包。按视频操作,无法实现;刚开始学java 哪位大神帮忙指点下,谢谢!

log4j2漏洞

log4j2 log4j2是apache下的java应用常见的开源日志库,java日志记录工具。 JNDI java命名和目录接口。允许从指定的远程服务器获取并加载对象。 JNDI相当于一个映射字典,使java应用程序可以和这些命名服务器和目录服务器之间进行交互。 JNDI注入攻击时常通过RMI和LDAP两种服务…

DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件

1 DeepSeek处理自有业务的案例:让AI给你写一份小众编辑器(EverEdit)的语法着色文件 1.1 背景AI能力再强,如果不能在企业的自有业务上产生助益,那基本也是一无是处。将企业的自有业务上传到线上训练,那是脑子进水的做法,竞争对手不仅捡了大便宜,自己的企业可能没享受到AI红…

102400118 林嘉祚 寒假集训第五专题

AC截图:1、自然数的拆分问题 数据范围很小,直接dfs暴力枚举就行。 #include <iostream> using namespace std;int n; int arr[10];void dfs(int x, int sum , int start) {if (sum > n){return;}if (sum == n && x != 2){for (int i = 1 ; i <= x-1 ; i+…

在线网校教育软件开发助力互联网时代教育发展

互联网时代,在线教育已成为推动教育事业发展的重要力量。开发优质的在线网校教育软件,能够有效整合资源、提升效率、促进公平,为教育发展注入新活力。以下是关键点: 一、 在线网校教育软件的优势 打破时空限制: 学生可随时随地学习,充分利用碎片化时间,提升学习效率。 优…

算法备案材料填报攻略

算法备案攻略本算法备案资料使用说明 算法备案材料涉及众多内容,其中以《自评估报告》最为复杂。为方便大家了解,特提供了下面的参考填写内容。注:算法备案自评估报告涉及160多个审核要素,每个算法的实际情况都不相同,以下内容仅供学习了解。如果有实际申报需求,建议咨询…

WPS Office for Mac 7.2.0 - 写作、表格处理、PPT 制作和 PDF 编辑

WPS Office for Mac 7.2.0 - 写作、表格处理、PPT 制作和 PDF 编辑WPS Office for Mac 7.2.0 - 写作、表格处理、PPT 制作和 PDF 编辑 Smarter, Faster, Easier, Free with Seamless MS Office Compatibility 请访问原文链接:https://sysin.org/blog/wps-for-mac-7/ 查看最新版…

Microsoft Office LTSC 2024 for Mac (Microsoft 365) 16.94 - 文档、电子表格、演示文稿和电子邮件

Microsoft Office LTSC 2024 for Mac (Microsoft 365) 16.94 - 文档、电子表格、演示文稿和电子邮件Microsoft Office LTSC 2024 for Mac (Microsoft 365) 16.94 - 文档、电子表格、演示文稿和电子邮件 Office LTSC 2024 for Mac (Word, Excel, PowerPoint, Outlook + OneNote,…

配置文件密文存储敏感信息服务启动流程设计

start() {# ()创建子进程(flock -x 200 # 200 文件描述符,进程级别的。ctl_n=$(ps -fu ${USER} | grep xxx start | grep -v grep | grep -v "$$" | wc -l) # grep -v "$$" 过滤掉当前进程if [ ${ctl_n} -gt 1 ]; thenecho -e "Exist kafka_ctl is…

Failed to load module script Expected a JavaScript module script 解决方案

部署若依前端vue3到云服务器的时候,一直在转圈圈加载中,最后排查出来是vite打包的时候的一个设置出错了 按照下图的加一个点即可解决。本文来自博客园,作者:程序员鲜豪,转载请注明原文链接:https://www.cnblogs.com/hg-blogs/p/18714033

内测之家-安全机制-签名(一)

API 加签的意义身份验证:在网络交互中,服务器需要确定请求的来源是否可靠。通过对请求进行加签,服务器可以验证请求是否来自合法的客户端。客户端使用独特的密钥进行签名操作,服务器能够依据已知的密钥信息对签名进行校验,只有签名验证通过,才能确认请求源自合法身份,有…