zoukankan      html  css  js  c++  java
  • 模拟+bfs——cf1344D

    #include<bits/stdc++.h>
    using namespace std;
    #define N 2005
     
    char s[N][N];
    int n,m,vis[N][N],ans,f1[N],f2[N];
     
    void dfs(int i,int j){
        vis[i][j]=1;
        if(i+1<=n && s[i+1][j]=='#' && !vis[i+1][j])
            dfs(i+1,j);
        if(j-1>=1 && s[i][j-1]=='#' && !vis[i][j-1])
            dfs(i,j-1);
        if(i-1>=1 && s[i-1][j]=='#' && !vis[i-1][j])
            dfs(i-1,j);
        if(j+1<=m && s[i][j+1]=='#' && !vis[i][j+1])
            dfs(i,j+1);
        
    }
     
    int main(){
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            scanf("%s",s[i]+1);
        int ff=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++){
                if(s[i][j]=='#')ff=1;
            }
        if(!ff){
            cout<<0<<'
    ';
             return 0;
        }
        
        //所有同行同列的#必须挨在一起 
        for(int i=1;i<=n;i++){
            int L=m+1,R=0;
            for(int j=1;j<=m;j++)
                if(s[i][j]=='#')R=j;
            for(int j=m;j>=1;j--)
                if(s[i][j]=='#')L=j;
            for(int j=L;j<=R;j++)
                if(s[i][j]=='.'){
                    puts("-1");return 0;
                }
        }
        for(int j=1;j<=m;j++){
            int U=n+1,D=0;
            for(int i=1;i<=n;i++)
                if(s[i][j]=='#')D=i;
            for(int i=n;i>=1;i--)
                if(s[i][j]=='#')U=i;
            for(int i=U;i<=D;i++)
                if(s[i][j]=='.'){
                    puts("-1");return 0;
                }
        }
        
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++)
                if(s[i][j]=='#')f1[i]=1;
        }
        for(int j=1;j<=m;j++){
            for(int i=1;i<=n;i++)
                if(s[i][j]=='#')f2[j]=1;
        }
        int c1=0,c2=0;
        for(int i=1;i<=n;i++)if(f1[i]==0)c1++;
        for(int j=1;j<=m;j++)if(f2[j]==0)c2++;
        if(c1&&!c2 || !c1&&c2){puts("-1");return 0;}
        
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                if(!vis[i][j] && s[i][j]=='#')++ans,dfs(i,j);
        
        cout<<ans<<'
    ';
        
    }
  • 相关阅读:
    图->存储结构->十字链表
    图->存储结构->邻接表
    P2278-[HNOI2003]操作系统
    P1801-黑匣子_NOI导刊2010提高(06)
    P1197-[JSOI2008]星球大战
    P2024- [NOI2001]食物链
    P1111-修复公路
    ACM模板——二分图匹配
    P2055-[ZJOI2009]假期的宿舍
    ACM模板——强连通分量
  • 原文地址:https://www.cnblogs.com/zsben991126/p/12848411.html
Copyright © 2011-2022 走看看