zoukankan      html  css  js  c++  java
  • [蓝桥杯2018初赛]全球变暖

     题目描述

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

    输入

    第一行包含一个整数N。  (1 <= N <= 1000)  
    以下N行N列代表一张海域照片。  
    照片保证第1行、第1列、第N行、第N列的像素都是海洋。  

    输出

    一个整数表示答案。

    样例输入

    7 
    .......
    .##....
    .##....
    ....##.
    ..####.
    ...###.
    .......  

    样例输出

    1

     题解:dfs判断有几个孤立的岛屿,同时用vis[]数组判断该岛屿是否会被淹没,结果相减就可以

    #include<iostream>
    #include<string>
    #include<algorithm>
    #include<math.h>
    #include<string.h>
    #include<map>
    #include<stack>
    #include<queue>
    #include<set>
    #define ll long long
    using namespace  std;
    char a[1005][1005],b[1005][1005];
    int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
    int n,ans=0,cnt=0;
    int vis[1005];
    int check(int x,int y)
    {
        if(x>=0&&x<n&&y>=0&&y<n)
            return 1;
        else
            return 0;
    }
    void dfs(int x,int y,int k)
    {
        if(check(x,y)==0)
            return ;
        if(b[x][y]=='#'&&b[x+1][y]=='#'&&b[x-1][y]=='#'&&b[x][y+1]=='#'&&b[x][y-1]=='#')
            vis[k]=1;//对于每个孤立的岛屿判断是否会被淹没
        for(int i=0;i<4;i++)
        {
            int dx=x+dir[i][0];
            int dy=y+dir[i][1];
            if(check(dx,dy)&&a[dx][dy]=='#')
            {
                a[dx][dy]='.';
                dfs(dx,dy,k);
            }
        }
    }
    int main()
    {
        cin>>n;
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                cin>>a[i][j];
                b[i][j]=a[i][j];
            }
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(a[i][j]=='.')
                    continue;
                else
                {
                    a[i][j]='.';
                    dfs(i,j,cnt);
                    cnt++;
                }
            }
        }
        for(int i=0;i<cnt;i++)
        {
            if(vis[i]==1)
                ans++;
        }
        cout<<cnt-ans<<endl;
        return 0;
    }
     
  • 相关阅读:
    linux下postgresql的c程序编译问题
    Linux下Sublime Text 2中文显示及中文输入问题[转][ubuntu 10.10]
    linux英文斜体乱码 【ubuntu 10.10】
    dropbox无法访问后国内网盘对比选择
    Linux查看系统信息的一些命令及查看已安装软件包的命令(转)
    linux配置ssh 【ubuntu 10.10】
    error: failed to push some refs【Linux】【Git】
    一些曾经收藏的话
    Linux系统源码安装过程中的prefix选项【转】
    LINUX GBK>UTF8文件编码批量转换脚本[转]
  • 原文地址:https://www.cnblogs.com/-citywall123/p/12373810.html
Copyright © 2011-2022 走看看