当前位置:   article > 正文

【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(14)_蓝桥杯难度和洛谷

蓝桥杯难度和洛谷

目录

写在前面:

题目:P1332 血色先锋队 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

        题目描述:

        输入格式:

        输出格式:

        输入样例:

        输出样例:

解题思路:

代码:

AC !!!!!!!!!!

写在最后:


写在前面:

怎么样才能学好一个算法?

我个人认为,系统性的刷题尤为重要,

所以,为了学好广度优先搜索,为了用好搜索应对蓝桥杯,

事不宜迟,我们即刻开始刷题!

题目:P1332 血色先锋队 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述:

输入格式:

第 1 行:四个整数 n,m,a,b,

表示军团矩阵有 n 行 m 列。有 a 个感染源,b 为血色敢死队中领主的数量。

接下来 a 行:每行有两个整数 x,y,表示感染源在第 x 行第 y 列。

接下来 b 行:每行有两个整数 x,y,表示领主的位置在第 x 行第 y 列。

输出格式:

第 1 至 b 行:每行一个整数,表示这个领主感染瘟疫的时间,输出顺序与输入顺序一致。

如果某个人的位置在感染源,那么他感染瘟疫的时间为 0。

输入样例:

  1. 5 4 2 3
  2. 1 1
  3. 5 4
  4. 3 3
  5. 5 3
  6. 2 4

输出样例:

  1. 3
  2. 1
  3. 3

解题思路:

根据题意,在这个血色军团组成的矩阵里,

有a个感染源,他们会向四个方向感染,

我们先将感染源的感染模拟一下,观察他的规律:

我们根据题目的给出的样例,

从感染源开始bfs

 继续往下搜索:

 直到将整个血色军团都感染:

题目要求的输出的领主感染顺序,

是按照输入的顺序输出,所以,

我们有两种解决方法,

一种是用一个数组按输入顺序存储领主的感染时间,

一种是我们先用bfs搜索,然后在输入领主坐标的时候,直接输出领主的感染时间,

这里我使用的是第二种方法,

下面是代码实现:

代码:

  1. //包好头文件
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. int n, m, a, b;
  8. typedef pair<int, int> PII;
  9. const int N = 510;
  10. //记录每个位置什么时候被感染
  11. int dist[N][N];
  12. PII q[N * N];
  13. int head = 0;
  14. int tail = -1;
  15. //存偏移量
  16. int dx[] = {-1, 0, 1, 0};
  17. int dy[] = {0, 1, 0, -1};
  18. void bfs()
  19. {
  20. //如果队列为空就不循环
  21. while(head <= tail)
  22. {
  23. auto t = q[head++];
  24. for(int i = 0; i < 4; i++)
  25. {
  26. int a = t.first + dx[i];
  27. int b = t.second + dy[i];
  28. //空边界
  29. if(a < 1 || a > n || b < 1 || b > m) continue;
  30. if(dist[a][b] >= 0) continue;
  31. dist[a][b] = dist[t.first][t.second] + 1;
  32. q[++tail] = {a, b};
  33. }
  34. }
  35. }
  36. int main()
  37. {
  38. scanf("%d %d %d %d", &n, &m, &a, &b);
  39. //初始化状态数组
  40. memset(dist, -1, sizeof(dist));
  41. for(int i = 0; i < a; i++)
  42. {
  43. int x, y;
  44. scanf("%d %d", &x, &y);
  45. //现将所以瘟疫源都入队,就能实现几个位置同时搜索
  46. q[++tail] = {x, y};
  47. dist[x][y] = 0;
  48. }
  49. bfs();
  50. //根据题目输入顺序输出领主
  51. for(int i = 0; i < b; i++)
  52. {
  53. int x, y;
  54. scanf("%d %d", &x, &y);
  55. printf("%d\n", dist[x][y]);
  56. }
  57. return 0;
  58. }

AC !!!!!!!!!!

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果喜欢本文的话,欢迎点赞和评论,写下你的见解。

如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。

之后我还会输出更多高质量内容,欢迎收看。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/385340
推荐阅读
相关标签
  

闽ICP备14008679号