CF1345 D. Monopole Magnets

D. Monopole Magnets

Question

题意太麻烦懒得解释

Solution

  • 特判-1的情况:
    1.某一行(列)存在’#‘且不连续的情况
    2 .某一行(列)全为’.‘的同时且所有列(行)均存在’#’
  • 求连通块的个数

Code

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-8;
const int NINF = 0xc0c0c0c0;
const int INF  = 0x3f3f3f3f;
const ll  mod  = 1e9 + 7;
const ll  maxn = 1e6 + 5;
const int N = 1000 + 5;

int n,m;
char s[N][N];
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int idx=0;
int r[N],c[N];

void dfs(int x,int y){
	s[x][y]='.';
	for(int i=0;i<4;i++){
		int tx=x+dx[i];
		int ty=y+dy[i];
		if(s[tx][ty]=='#') dfs(tx,ty);
	}
}


int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	bool flag=true;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>s[i]+1;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(s[i][j]=='#') r[i]++,c[j]++;
		}
	}
	for(int i=1;i<=n;i++){
		bool ok=false;
		if(r[i]==0){
			for(int j=1;j<=m;j++) if(!c[j]) ok=true;
			if(!ok){flag=false;break;}
		}
	}
	for(int i=1;i<=m;i++){
		bool ok=false;
		if(c[i]==0){
			for(int j=1;j<=n;j++) if(!r[j]) ok=true;
			if(!ok){flag=false;break;}
		}
	}
	for(int i=1;i<=n&&flag;i++){
		bool ok=false;
		for(int j=1;j<=m;j++){
			if(s[i][j]=='#'){
				if(ok) {flag=false;break;}
				ok=true;
				while(s[i][j]=='#' && j<=m) j++;
			}
		}
	}
	for(int i=1;i<=m&&flag;i++){
		bool ok=false;
		for(int j=1;j<=n;j++){
			if(s[j][i]=='#'){
				if(ok) {flag=false;break;}
				ok=true;
				while(s[j][i]=='#' && j<=n) j++;
			}
		}
	}
	if(!flag) {cout<<-1<<'\n';return 0;}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			if(s[i][j]=='#')
				idx++,dfs(i,j);
	cout<<idx<<'\n';
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Meulsama/article/details/105972551