zoukankan      html  css  js  c++  java
  • Monopole Magnets CodeForces

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define ll long long
    using namespace std;
    const int N=1010;
    bool x[N],y[N];
    char s[N][N];
    bool st[N][N];
    int n,m;
    int dx[]={1,-1,0,0};
    int dy[]={0,0,1,-1};
    void dfs(int x,int y)
    {
    	st[x][y]=1;
    	for(int i=0;i<4;i++)
    		for(int j=0;j<4;j++)
    		{
    			int xx=x+dx[i],yy=y+dy[i];
    			if(xx>=0&&xx<n&&yy>=0&&yy<m&&st[xx][yy]==0&&s[xx][yy]=='#')
    				dfs(xx,yy);
    		}
    }
    int main()
    {
    	cin>>n>>m;
    	for(int i=0;i<n;i++)
    		cin>>s[i];
    	bool flag=1;
    	//如果某一行或者某一列存在 那么就要是连续的
    	//如果不是这样的话,因为N要在黑块之间移动,那么就必然会经过白块到没有同行或列的另外一部分 
    	for(int i=0;i<n;i++)
    		for(int j=0;j<m;j++)
    			if(s[i][j]=='#')
    			{
    				if(x[i]&&j&&s[i][j-1]!='#')
    				{
    					flag=0;
    					break;
    				}
    				if(y[j]&&i&&s[i-1][j]!='#')
    				{
    					flag=0;
    					break;
    				}
    				x[i]=y[j]=1;
    			}
    	//如果有一行或者一列不存在黑块
    	//那么行不存在和列不存在 要同时成立
    	//然后S放在行和列的相交的部分 
    	//因为每行每列至少有一个南磁石。
    	int p1=0,p2=0;
    	for(int i=0;i<n;i++)
    		if(!x[i])
    			p1=1;
    	for(int i=0;i<m;i++)
    		if(!y[i])
    			p2=1;
    	if(p1^p2)
    		flag=0;
    	if(flag==0)
    	{
    		cout<<"-1"<<endl;
    		return 0;
    	}
    	//都满足的话,就是统计连通块的个数了 
    	int cnt=0;
    	for(int i=0;i<n;i++)
    		for(int j=0;j<m;j++)
    			if(s[i][j]=='#'&&st[i][j]==0)
    			{
    				cnt++;
    				dfs(i,j);
    			}
    	cout<<cnt<<endl;
    	return 0;
    }
    
  • 相关阅读:
    Redis
    多线程相关
    selenium操作浏览器的基本方法
    selenium之 webdriver与三大浏览器版本映射表(更新至v2.29)
    selenium安装及官方文档
    Python(3)_python对Json进行操作
    python类中的self参数和cls参数
    python3中shuffle函数
    Python3中assert断言
    python2和python3中range的区别
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12885636.html
Copyright © 2011-2022 走看看