zoukankan      html  css  js  c++  java
  • 蓝桥杯 全球变暖(dfs)


    标题:全球变暖


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

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

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

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

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

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

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

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

    【样例输入】
    7

    【样例输出】
    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 }
  • 相关阅读:
    Serializable读写类操作
    socket模拟通信
    使用poi实现生成excel文件
    注解形式的通知
    使用linkedhashmap实现LRU(最近最少使用缓存算法)
    websocket的使用
    centos systemctl daemon-reload 提示 no such file or directory 的一个原因
    mac 10.13 build 一个 redis desktop manager
    mac 必备工具
    supervisor 添加新配置不生效的问题
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/10542064.html
Copyright © 2011-2022 走看看