DFS_全球变暖_蓝桥杯2018省赛N0.9

你有一张某海域NxN像素的照片,"."表示海洋、"#"表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有2座岛屿。  
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。  

输入格式
第一行包含一个整数N。  (1 <= N <= 1000)  
以下N行N列代表一张海域照片。  
照片保证第1行、第1列、第N行、第N列的像素都是海洋。  
输出格式
一个整数表示答案
输入样例
7 ....... .##.... .##.... ....##. ..####. ...###. ....... 输出样例 1

我拿到这题肯定知道是搜索,但是题目的意思让我匪夷所思,后来慢慢才懂题目的意思。懂了之后,和大多数人的想法一样,两遍dfs搜索找遍全球变暖前后的岛屿数然后相减就是最后的答案。

有篇博主的答案给的代码让我觉得他的想法挺惊艳的,既然求照片中有多少岛屿会被完全淹没,那么只需要找出那些在搜索过程中岛屿上的土地周围都存在海水的岛屿就好了,至于其他有那种四周都有土地的岛屿,它最后只剩一块土地也好,它分成2,3个岛屿也罢,我都不需要去管

另外,那个源代码有挺多问题的,我改了一下,开始没注意到边界问题,程序直接崩了

#include<iostream>
#include<cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int n;
char map[110][110];
int ans[11000];
int vis[110][110];

void dfs(int x, int y, int k)
{
    if(map[x][y]=='.'||vis[x][y]||x<0||y<0||x>=n||y>=n)
        return;
    vis[x][y]=1;
    if(map[x-1][y]=='#'&&map[x+1][y]=='#'&&map[x][y-1]=='#'&&map[x][y+1]=='#')
        ans[k]++;
    dfs(x+1, y, k);
    dfs(x-1, y, k);
    dfs(x, y-1, k);
    dfs(x, y+1, k);
}
int main()
{
    memset(vis, 0, sizeof(vis));
    scanf("%d", &n);
    for(int i = 0; i < n; i++)
        scanf("%s", &map[i]);

    int cnt=0;
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            if(map[i][j]=='#'&&!vis[i][j]) {
                dfs(i, j, cnt);
                cnt++;
            }
        }
    }
    
    int sum=0;
    for(int i = 0; i < cnt; i++)
        if(ans[i]==0)
            sum++;
    printf("%d\n",sum);
    
    return 0;
}

参考自:https://www.cnblogs.com/flightless/p/8718443.html

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