当前位置:   article > 正文

蓝桥杯——全球变暖(dfs)_蓝桥杯全球变暖

蓝桥杯全球变暖

题目描述
你有一张某海域 N×N 像素的照片,”.”表示海洋、”#”表示陆地,如下所示:

  1. .......
  2. .##....
  3. .##....
  4. ....##.
  5. ..####.
  6. ...###.
  7. .......


其中”上下左右”四个方向上连在一起的一片陆地组成一座岛屿,例如上图就有 2 座岛屿。

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。

具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

例如上图中的海域未来会变成如下样子:

  1. .......
  2. .......
  3. .......
  4. .......
  5. ....#..
  6. .......
  7. .......


请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。

输入格式
第一行包含一个整数N 

以下 N 行 N 列,包含一个由字符”#”和”.”构成的 N × N 字符矩阵,代表一张海域照片,”#”表示陆地,”.”表示海洋

照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。

输出格式
一个整数表示答案。

数据范围
1 ≤ N ≤ 1000

【样例输入】

  1. 7
  2. .......
  3. .##....
  4. .##....
  5. ....##.
  6. ..####.
  7. ...###.
  8. .......

【样例输出】
 

1

思路

遍历整个图片,遇到陆地‘#’则进入dfs搜索,并将已访问过的坐标标记为‘&’;

在dfs中要做这么几件事情:1.判断传入的坐标是否越界,越界则返回;2.判断该坐标位置是否是陆地且未被访问过,不是陆地或已被访问过则返回;3.若到达的是一块未被访问过的陆地,则将其标记为代表访问过的符号‘&’,并判断该坐标是否会沉没,然后分上下左右四个方向继续进行搜索。

题解

  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4. int sinking; //用于判断该岛屿是否会沉没
  5. void dfs(vector<vector<char>>& grid, int i, int j);
  6. bool inArea(vector<vector<char>>& grid, int i, int j);
  7. int main()
  8. {
  9. int k;
  10. cin >> k;
  11. vector<vector<char>> grid(k,vector<char>(k));
  12. for (int i = 0; i < k; i++) {
  13. for (int j = 0; j < k; j++) {
  14. char c;
  15. cin >> c;
  16. if (c == '\n') {
  17. j--;
  18. continue;
  19. }
  20. grid[i][j] = c;
  21. }
  22. }
  23. int ans = 0;
  24. int cnt = 0;
  25. for (int i = 0; i < k; i++) {
  26. for (int j = 0; j < k; j++) {
  27. sinking = 1;
  28. if (grid[i][j] == '#') {
  29. cnt++;
  30. dfs(grid, i, j);
  31. if (sinking == 1) {
  32. ans++;
  33. }
  34. }
  35. }
  36. }
  37. //cout << "起始岛屿数量:" << cnt << endl;
  38. cout << ans;
  39. }
  40. void dfs(vector<vector<char>>& grid, int i, int j)
  41. {
  42. if (!inArea(grid, i, j)) {
  43. return;
  44. }
  45. if (grid[i][j] != '#') {
  46. return;
  47. }
  48. grid[i][j] = '&';
  49. bool flag = true;
  50. //如果四个方向中相邻的有海域,则这个坐标的陆地会沉没
  51. if (inArea(grid, i - 1, j) && grid[i - 1][j] == '.') flag = false;
  52. if (inArea(grid, i + 1, j) && grid[i + 1][j] == '.') flag = false;
  53. if (inArea(grid, i, j - 1) && grid[i][j - 1] == '.') flag = false;
  54. if (inArea(grid, i, j + 1) && grid[i][j + 1] == '.') flag = false;
  55. //如果上下左右都是陆地,则该坐标不会沉没,进而该坐标所在的岛屿会有保留的部分
  56. if (flag) {
  57. sinking = 0;
  58. }
  59. dfs(grid, i - 1, j);
  60. dfs(grid, i + 1, j);
  61. dfs(grid, i, j - 1);
  62. dfs(grid, i, j + 1);
  63. }
  64. bool inArea(vector<vector<char>>& grid, int i, int j)
  65. {
  66. return i >= 0 && i < grid.size() && j >= 0 && j < grid[0].size();
  67. }

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

闽ICP备14008679号