zoukankan      html  css  js  c++  java
  • 连通块个数

    题意:

    给你一张图,#表示有水的地方,求出图中水面积的最大值。

    分析:

    很简单,遍历这张图,遇到未被标记的#就把cnt加一,并开始深搜,把搜到的#都标记上,直到八连通被阻断。

    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <algorithm>
    #define range(i,a,b) for(int i=a;i<=b;++i)
    #define rerange(i,a,b) for(int i=a;i>=b;--i)
    #define LL long long
    #define fill(arr,tmp) memset(arr,tmp,sizeof(arr))
    using namespace std;
    char map[105][105];
    int x,y,idx[105][105];
    void dfs(int r,int c,int id){
        if(r<0||r>=x||c<0||c>=y||(idx[r][c]>0||map[r][c]!='W'))return;//越界或深搜直无水则回溯。
        idx[r][c]=id;//标记水块id
        range(dr,-1,1)range(dc,-1,1)
        if(dr||dc)dfs(r+dr,c+dc,id);//八连通深搜
    }
    int main(int argc, char *argv[]) {
        cin>>x>>y;
        range(i,0,x-1)scanf("%s",map[i]);//输入
        fill(idx,0);
        int cnt=0;
        range(i,0,x-1)range(j,0,y-1)
        if(idx[i][j]==0&&map[i][j]=='W')dfs(i,j,++cnt);//遍历图
        cout<<cnt<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    [BZOJ4825][HNOI2017]单旋(线段树+Splay)
    [BZOJ4542][HNOI2016]大数(莫队)
    [LOJ6281]数列分块入门 5
    [LOJ6280]数列分块入门 4
    [LOJ6279]数列分块入门 3
    [LOJ6278]数列分块入门 2
    [LOJ6277]数列分块入门 1
    [BZOJ2120]数颜色
    [BZOJ3585]mex
    [ZJb417]区间众数
  • 原文地址:https://www.cnblogs.com/Rhythm-/p/9323412.html
Copyright © 2011-2022 走看看