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

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

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

    【输入格式】
    第一行包含一个整数N。  (1 <= N <= 1000)  

    以下N行N列代表一张海域照片。  

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

      【输出格式】

    一个整数表示答案

    比较害怕这种问题,所以没敢写。

    困惑点:

    1 如何判断有几个岛屿?想用dfs判断,做多遍dfs。这个思路是对的,其实我们用两个for循环搜索第一个未被访问过的#, 做dfs就好。

    2 怎么把每个岛屿记录下来?之后判断岛屿是否会被全部淹没。但是其实这个过程我们可以在找岛屿的过程中就进行判断,判断在该岛屿中是否存在一个点#,它的四周都是#

    #include<iostream>
    #include<cstdio>
    using namespace std;
    int mp[110][110];
    int ans[11000];
    bool vis[110][110];
    void dfs(int x,int y,int k)
    {
        if(mp[x][y]=='.')
            return;
        if(vis[x][y])
            return;
        vis[x][y]=1;
        if(mp[x-1][y]=='#'&&mp[x+1][y]=='#'&&mp[x][y-1]=='#'&&mp[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()
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            getchar();
            for(int j=1;j<=n;j++)
                scanf("%c",&mp[i][j]);
    
        }
        int len=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(mp[i][j]=='#'&&!vis[i][j])
                {
                    dfs(i,j,len);
                    len++;
                }
            }
        }
        int sum=0;
        for(int i=0;i<len;i++)
            if(ans[i]==0)
                sum++;
        printf("%d
    ",sum);
    }
  • 相关阅读:
    [转]深度理解依赖注入(Dependence Injection)
    [转]控制反转(IOC)和依赖注入(DI)
    [转]依赖注入的概念
    [转]struct实例字段的内存布局(Layout)和大小(Size)
    异步编程模式
    HTTP协议返回代码含义
    [转]StructLayout特性
    Stack的三种含义
    FineUI登入的例子中遇到的一些问题
    编程以外积累: 如何给项目生成类似VS2008的说明文档
  • 原文地址:https://www.cnblogs.com/flightless/p/8718443.html
Copyright © 2011-2022 走看看