【搜索】多源BFS专题

news/2025/1/16 20:05:27/文章来源:https://www.cnblogs.com/Tshaxz/p/18675683

跳马(多源BFS变种,每个起点有步数限制)

image

image

补充几个测试样例
输入

3 2
. .
2 .
. .

输出

0

输入

3 5
4 7 . 4 8
4 7 4 4 .
7 . . . .

输出

17

输入

3 4
. . . .
. 2 . .
. . . .

输出

0

输入

3 4
. . . .
. 2 2 .
. . . .

输出

-1

本题很坑爹的地方在于,输入的字符串还用空格分开,所以读入时不能用读连续字符串的方法,例如
读字符串数组(n * m字符矩阵,中间无空格)char g[N][N]写法

for (int i = 0; i < n; i++) scanf("%s", g[i]);//读取
for (int i = 0; i < n; i++) printf("%s\n", g[i]);//输出写法1
for (int i = 0; i < n; i++) puts(g[i]);//输出写法2

只能当成矩阵一个一个读,就和读int型二维矩阵一样。

分析:本题数据量不大且因为每个点有移动步数限制,所以采用每个点都搜一次的方法,搜完一个点,dist数组中存的就是该点到其余所有位置的最小步数,更新到total数组中,如果dist[i][j] == -1,或dist[i][j] > step,则说明该点不可达,在total中标记为-1.
最后遍历一遍total数组,把所有-1改成正无穷,再取最小值输出即可。

C++代码

/*** Created by Tshaxz on 25-1-16.*/
#include <iostream>
#include <cstring>
#include <queue>using namespace std;typedef pair<int, int> PII;const int N = 30, INF = 0x3f3f3f3f;int n, m;
char g[N][N];
int dist[N][N], total[N][N];
int dx[8] = {1, 2, 2, 1, -1, -2, -2, -1};
int dy[8] = {2, 1, -1, -2, -2, -1, 1, 2};void bfs(int x, int y, int step)
{memset(dist, -1, sizeof dist);queue<PII> q;dist[x][y] = 0;q.push({x, y});while (q.size()){auto [x, y] = q.front();q.pop();for (int i = 0; i < 8; i++){int a = x + dx[i], b = y + dy[i];if (a < 0 || a >= n || b < 0 || b >= m) continue;if (dist[a][b] != -1) continue;if (dist[a][b] > step) continue;dist[a][b] = dist[x][y] + 1;q.push({a, b});}}
}int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> m;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)cin >> g[i][j];for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)if (g[i][j] != '.'){int step = g[i][j] - '0';bfs(i, j, step);for (int x = 0; x < n; x++)for (int y = 0; y < m; y++){if (dist[x][y] > step) total[x][y] = -1;else if (total[x][y] != -1) total[x][y] += dist[x][y];}}int res = INF;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){if (total[i][j] == -1) total[i][j] = INF;res = min(res, total[i][j]);}if (res == INF) res = -1;cout << res << '\n';return 0;
}

debug版代码,可以输出dist与total数组查看

/*** Created by Tshaxz on 25-1-16.*/
#include <iostream>
#include <cstring>
#include <queue>using namespace std;typedef pair<int, int> PII;const int N = 30, INF = 0x3f3f3f3f;int n, m;
char g[N][N];
int dist[N][N], total[N][N];
int dx[8] = {1, 2, 2, 1, -1, -2, -2, -1};
int dy[8] = {2, 1, -1, -2, -2, -1, 1, 2};void bfs(int x, int y, int step)
{memset(dist, -1, sizeof dist);queue<PII> q;dist[x][y] = 0;q.push({x, y});// printf("step: %d\n", step);while (q.size()){auto [x, y] = q.front();q.pop();for (int i = 0; i < 8; i++){int a = x + dx[i], b = y + dy[i];if (a < 0 || a >= n || b < 0 || b >= m) continue;if (dist[a][b] != -1) continue;if (dist[a][b] > step) continue;dist[a][b] = dist[x][y] + 1;q.push({a, b});}}
}// void print1()
// {
//     printf("dist: \n");
//     for (int i = 0; i < n; i++)
//     {
//         for (int j = 0; j < m; j++) printf("\t%d\t", dist[i][j]);
//         puts("");
//     }
// }// void print2()
// {
//     printf("total:\n");
//     for (int i = 0; i < n; i++)
//     {
//         for (int j = 0; j < m; j++) printf("\t%d\t", total[i][j]);
//         puts("");
//     }
// }int main()
{ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> m;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)cin >> g[i][j];for (int i = 0; i < n; i++)for (int j = 0; j < m; j++)if (g[i][j] != '.'){int step = g[i][j] - '0';bfs(i, j, step);// printf("当前的马:g[%d][%d]:%c\n", i, j, g[i][j]);// print1();for (int x = 0; x < n; x++)for (int y = 0; y < m; y++){if (dist[x][y] > step) total[x][y] = -1;else if (total[x][y] != -1) total[x][y] += dist[x][y];}// print2();}int res = INF;for (int i = 0; i < n; i++)for (int j = 0; j < m; j++){if (total[i][j] == -1) total[i][j] = INF;res = min(res, total[i][j]);}if (res == INF) res = -1;cout << res << '\n';return 0;
}

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

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

相关文章

代码随想录算法训练营第四天 | 24. 两两交换链表中的节点、19. 删除链表的倒数第N个节点、160.链表相交、142.环形链表II

9-24.两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。示例 1:输入:head = [1,2,3,4] 输出:[2,1,4,3] 示例 2: 输入:head = [] 输出:[] 示例 3: 输入:he…

2025 省选模拟 6

2025 省选模拟 6 A.圣诞树 DP,计数题 考虑题目题目的两个限制相邻两层彩球颜色集合不同同层相邻两个彩球颜色不同发现求出每一行恰好 \(j\) 个颜色后第二个限制很简单就解决了。 设 \(f_{i,j}\) 表示长度为 \(i\) 时恰好有 \(j\) 个颜色的方案数(对于一行考虑) 设 \(g_{i,j}…

第一次

第一次 1. 神秘符文的重复序列 逻辑思维#include<bits/stdc++.h> using namespace std; int main(){int n,k;cin>>n>>k;//长度为n,重复k遍!string s;cin>>s;long long int ans=0;long long int cnt=0;while(k--) {//重复k遍for(int i=0;i<n;i++)…

在kubernates中安装安卓模拟器

1.检测环境 root@xx:~# apt install cpu-checker root@xx:~# kvm-ok INFO: /dev/kvm exists KVM acceleration can be used root@xx:~# ll /dev/kvm crw-rw---- 1 root kvm 10, 232 Jan 15 16:38 /dev/kvm确认/dev/kvm设备存在即可。如果是ESXi虚拟机服务器,则需要在虚拟机配置…

告别虚拟机!WSL2安装配置教程!!!

作者:SkyXZ CSDN:SkyXZ~-CSDN博客 博客园:SkyXZ - 博客园 由于Linux的系统的稳定以及在环境管理方面的优越性,同时Linux对于ROS系统的独占,很多时候我们都乐意在Linux系统下开发我们机器人的算法,但是由于Windows和Linux系统的存在内核方面的天壤之别,在我们手边…

windows安装Mosquitto(MQTT服务)

安装说明: https://www.cnblogs.com/xiaosongboke/p/18604458, https://blog.csdn.net/qq_44477552/article/details/143883087设置账号和密码.\mosquitto_passwd.exe -c .\pwfile.example admin注意:CMD以管理员方式运行。 修改配置文件mosquitto.confallow_anonymous fals…

ABC 337 G(主席树)

最近刚学完主席树,找了道题巩固一下,还是非常有收获的。 题目链接:problem 若只让求\(f(1)\),则还是比较简单的——用权值树状数组维护\(dfs\)路径上的数,每次查一下在 递归路径中\(>\)当前结点值 的结点数量,累加起来即为\(f(1)\)。 可是题目要求将\(f(1)到f(n)\)全部…

28. 事件处理

一、事件与事件处理 1.1、什么是事件事件是程序收到外界的输入,处于某种状态时自动发送的信号。事件有固定的类型,每种类型有自己的处理函数,用户只要重写这些函数,即可达到特定的目的。通过事件可以用一个控件监测另外一个控件,并可过滤被监测控件发出的事件。可视化应用…

2025上半年

孩子们,正睿补习计划重启了。 自建题单:ZR 2022 summer B - Virtual Judge P10447 最短 Hamilton 路径 - 洛谷 | 计算机科学教育新生态 求从 \(1\) 号点出发恰好经过每个点一次并且最终回到 \(1\) 号点的最短路径。 设 \(dp_{i,s}\) 表示恰好经过了集合 \(s\) 中的点一次,当…

Agent FFT

Agent FFT请你根据 https://www.cnblogs.com/CDOI-24374/p/17733240.html 这篇文章,仿照写一个好的,以下是一篇仿照《Azune FFT》风格的文章: Azune FFT:异界之战 可能是 Azune 童话系列。感谢 int_R 提供灵感与素材,让奇幻之光照亮一切! ——题记 「报告,INQ。已抵达 …

2025/1/16

今天继续学习了Android开发的相关知识,做手机端的app今天学的是用xml文件控制页面,类似javaweb里面的前端,有许多标签,还解决了运行卡退的一个小问题,需要定义一个主题。

CICD Day9、Argo CD增强持续交付

1、Argo CD简介在Jenkins CI/CD流程中的持续交付阶段,既部署到k8s集群阶段,使用kubectl工具来进行应用程序的部署和更新操作,但这种方式无法实时跟踪应用程序的状态。这将造成用户在CI/CD流程完成后需要额外操作kubernetes集群,以进一步查看应用程序的状态。为了解决这些问…