蓝桥杯2018省赛全球变暖dfs

全球变暖

问题描述


格式输入


格式输出

输出一个整数


样例输入


样例输出

1


评测用例规模与约定

  1. 最大运行时间:1s
  2. 最大运行内存: 256M

解析

采用dfs的方式进行搜索,首先输入地图之后进行搜索判断所有岛屿的数量,所有不会被淹没的岛屿的数量(因为只要有一块不和水相接就可以判断为是不会被淹没的所以才取它),然后相减即可得到被淹没的岛屿的数量。


参考程序

c 复制代码
#include<bits/stdc++.h>
using namespace std;
int n;
const int N = 1e4+4; 
char area[N][N];
bool flag;
int cnt; 
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//往四个方向走
int ans=0;//没有被淹没岛屿的数量 
int res=0;//岛屿的总数量 
//用DFS判断搜到的这个岛屿会不会被淹没
void dfs(int x,int y)
{
    if(flag==false){ //一个岛屿只要有一个点满足就不会变淹没了
        cnt = 0;
    for(int i=0; i<4; i++){
        int tx=d[i][0]+x;
        int ty=d[i][1]+y;
        if(area[tx][ty]!='.')
        cnt++;
    }
    if(cnt==4){//有一个点满足不会被淹没的条件
        ans++;
        flag=true;//这个岛屿不需要再遍历了
         }
    }
    area[x][y]='*';//将遍历过的点变为 *,下一次就不会遍历了,所以不用标记数组
    //注意这里不可以是'.'因为上面if(area[tx][ty]!='.')cnt++
     for(int i=0;i<4;i++){
         int xx = x + d[i][0];
         int yy = y + d[i][1];
         if(area[xx][yy]=='#'&&x<N&&x>=0&&y<N&&y>=0)
         dfs(xx,yy);
    }
}
 
int main()
{    
     cin>>n; 
    for(int i=0; i<n; i++)
        for(int j=0; j<n; j++)
            cin>>area[i][j];
            
    for(int i=0; i<n; i++){ 
        for(int j=0; j<n; j++){
            if(area[i][j]=='#'){
                res++;
                flag=false;
                dfs(i,j);
            }
        }
    }        
    cout<<res-ans;    
    return 0;
}

以个人刷题整理为目的,如若侵权,请联系删除~

相关推荐
pearlthriving12 分钟前
STL容器及其底层
开发语言·c++·算法
念越14 分钟前
算法每日一题 Day04|快慢双指针法解决环形链表问题
数据结构·算法·链表
张人玉16 分钟前
VisionPro 药物检测工具 学习笔记
算法·c#·机器视觉·vsionpro
_深海凉_18 分钟前
LeetCode热题100-前 K 个高频元素
算法·leetcode·职场和发展
周末也要写八哥27 分钟前
深度剖析:动态规划的分类及实例
算法·动态规划
星马梦缘34 分钟前
离散数学——二元关系 作战记录
算法·离散数学
LDG_AGI38 分钟前
【搜索引擎】Elasticsearch(五):prefix前缀匹配方法大全(包含search_as_you_type等6种解法)
人工智能·深度学习·算法·elasticsearch·搜索引擎
她说彩礼65万41 分钟前
C语言 函数指针
c语言·开发语言·算法
王老师青少年编程41 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:纪念品分组
c++·算法·贪心·csp·信奥赛·排序贪心·纪念品分组
贾斯汀玛尔斯1 小时前
每天学一个算法--贪心算法(Greedy Algorithm)
算法·贪心算法