模拟+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<<'\n'; 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<<'\n'; }