蓝桥杯 全球变暖(dfs)

标题:全球变暖

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

《蓝桥杯 全球变暖(dfs)》

 

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

由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。

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

《蓝桥杯 全球变暖(dfs)》

 

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

【输入格式】
第一行包含一个整数N。 (1 <= N <= 1000)
以下N行N列代表一张海域照片。

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

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

【样例输入】
7
《蓝桥杯 全球变暖(dfs)》

 

【样例输出】
1

资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

注意:
main函数需要返回0;
只使用ANSI C/ANSI C++ 标准;
不要调用依赖于编译环境或操作系统的特殊函数。
所有依赖的函数必须明确地在源文件中 #include <xxx>
不能通过工程设置而省略常用头文件。

提交程序时,注意选择所期望的语言类型和编译器类型。

 

思路: 使用dfs分别计算出原始岛屿数和后来剩余的岛屿数即可。 

 

  1 #include<iostream>
  2 #include<string>
  3 #include<queue>
  4 #include<set>
  5 #include<cstring>
  6 #include<cmath>
  7 #include<algorithm>
  8 #include<stdio.h>
  9 
 10 using namespace std;
 11 
 12 char mp[1010][1010];
 13 int grid[1010][1010];    // 用于涂色判断
 14 int flag[1010][1010];    // mp[i][j]四周都不与海相邻,则flag[i][j] = 1
 15 
 16 int N;
 17 int dx[4] = { 1,-1,0,0 };
 18 int dy[4] = { 0,0,1,-1 };
 19 
 20 int color;    // 第一块岛屿范围内涂1,第二块岛屿范围内涂2,以此类推
 21 
 22 void dfs(int x, int y)
 23 {
 24     if (x < 0 || x >= N || y < 0 || y >= N)
 25         return;
 26 
 27     for (int i = 0; i < 4; ++i)
 28     {
 29         int xx = x + dx[i];
 30         int yy = y + dy[i];
 31 
 32         if (mp[xx][yy] == '#' && grid[xx][yy] == 0)
 33         {
 34             grid[xx][yy] = color;
 35             dfs(xx, yy);
 36         }
 37     }
 38 
 39 
 40 }
 41 
 42 bool isNotAdjacent(int x, int y)    // 该块陆地四周都不与海相邻,返回true
 43 {
 44     for (int i = 0; i < 4; ++i)
 45     {
 46         int xx = x + dx[i];
 47         int yy = y + dy[i];
 48 
 49         if (x >= 0 && x < N && y >= 0 && y < N && mp[xx][yy] == '.')
 50             return false;
 51     }
 52 
 53     return true;
 54 
 55 }
 56 
 57 
 58 int main()
 59 {
 60     cin >> N;
 61     for (int i = 0; i < N; ++i)
 62         for (int j = 0; j < N; ++j)
 63         {
 64             cin >> mp[i][j];
 65         }
 66 
 67     
 68     memset(grid, 0, sizeof(grid));
 69     color = 1;
 70     // 使用dfs计算原始岛屿数
 71     for (int i = 0; i < N; ++i)
 72         for (int j = 0; j < N; ++j)
 73         {
 74             if (mp[i][j] == '#' && grid[i][j] == 0)    // grid[i][j]等于0说明mp[i][j]还未被涂过色
 75             {
 76                 dfs(i, j);
 77                 color++;
 78             }
 79         }
 80 
 81     int start_num = color - 1;
 82 
 83     memset(flag, 0, sizeof(flag));
 84     for (int i = 0; i < N; ++i)
 85         for (int j = 0; j < N; ++j)
 86         {
 87             if (isNotAdjacent(i, j))
 88             {
 89                 flag[i][j] = 1;
 90             }
 91         }
 92 
 93 
 94     for (int i = 0; i < N; ++i)
 95         for (int j = 0; j < N; ++j)
 96         {
 97             if (flag[i][j] != 1)    // 将所有被淹没的陆地置为 '.'
 98             {
 99                 mp[i][j] = '.';
100             }
101         }
102 
103 
104 
105     memset(grid, 0, sizeof(grid));
106     color = 1;
107     // 再次使用dfs计算后来剩下的岛屿数
108     for (int i = 0; i < N; ++i)
109         for (int j = 0; j < N; ++j)
110         {
111             if (mp[i][j] == '#' && grid[i][j] == 0)
112             {
113                 dfs(i, j);
114                 color++;
115             }
116         }
117 
118     int end_num = color - 1;
119 
120     cout << start_num - end_num << endl;
121     
122     return 0;
123 }

 

    原文作者:踏樰无痕丶zz
    原文地址: https://www.cnblogs.com/FengZeng666/p/10542064.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞