zoukankan      html  css  js  c++  java
  • Codeforces 1345 D

    题目:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<map>
    #include<queue>
    #include<vector>
    #include<string>
    #include<fstream>
    
    using namespace std;
    typedef long long ll;
    const int N = 2e3 + 105;
    const int M = 1e6 + 5;
    const int mod = 998244353;
    const double Pi = acos(- 1.0);
    const int INF = 0x3f3f3f3f;
    const int G = 3, Gi = 332748118;
    //
    
    char mp[N][N];
    int n, m;
    bool visr[N], visc[N], visr2[N], visc2[N];
    int root[N * N];
    
    int Find(int x){
        return x == root[x] ? x : root[x] = Find(root[x]);
    }
    
    void Union(int x, int y){
        int tx = Find(x);
        int ty = Find(y);
        if(tx != ty){
            root[ty] = tx;
        }
    }
    
    int val(int x,int y){
        return (x - 1) * m + y;
    }
    
    void solve()
    {
        for(int i = 1; i <= n * m; ++ i) root[i] = i;
        for(int i = 1; i <= n; ++ i){
            for(int j = 1; j <= m; ++ j){
                if(mp[i][j] == '#'){
                    if(j < m &&mp[i][j + 1] == '#') Union(val(i,j), val(i,j + 1));
                    if(i < n && mp[i + 1][j] == '#') Union(val(i,j), val(i + 1, j));
                }
            }
        }
        int res = 0;
        for(int i = 1; i <= n; ++ i){
            for(int j = 1; j <= m; ++ j){
                if(mp[i][j] == '#' && Find(val(i,j)) == val(i,j)){
                    res ++;
                }
            }
        }
        printf("%d
    ",res);
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
       int B = 0, W = 0, flag = 0;
       for(int i = 1; i <= n; ++ i){
           B = 0, W = 0;
           scanf("%s",mp[i]+1);
           for(int j = 1; j <= m; ++ j){
               if(mp[i][j] == '.') {
                   W = 1;
                   if(B) W = 2;
               }
               else if(mp[i][j] == '#'){
                   B = 1;
                   if(W == 2) flag = 1;
                   visr[i] = 1;
                   visc[j] = 1;
               }
           }
       }
       if(flag){
           //cout<<"1"<<endl;
           printf("-1
    ");
           return 0;
       }
       B = 0, W = 0, flag = 0;
       for(int j = 1; j <= m; ++ j){
           B = 0, W = 0;
           for(int i = 1; i <= n; ++ i){
               if(mp[i][j] == '.'){
                   W = 1;
                   if(B) W = 2;
               }
               else if(mp[i][j] == '#'){
                   B = 1;
                   if(W == 2) flag = 1;
               }
           }
       }
       if(flag){
           //cout<<"2"<<endl;
           printf("-1
    ");
           return 0;
       }
    
       for(int i = 1; i <= n; ++ i)
           for(int j = 1; j <= m; ++ j){
               if(!visr[i] && !visc[j]) {
                   //cout<<i<<" "<<j<<endl;
                   visr2[i] = 1;
                   visc2[j] = 1;
               }
           }
           
       for(int i = 1; i <= n; ++ i) 
           if(!visr[i] && !visr2[i]) {
               flag = 1;
           }
       for(int i = 1; i <= m; ++ i)
           if(!visc[i] && !visc2[i]) {
               flag = 1;
           }
       if(flag){
           //cout<<"3"<<endl;
           printf("-1
    ");
           return 0;
       }
       solve();
       return 0;
    }
    /*
    3 7
    ......#
    .......
    #......
    */
    
    
    
  • 相关阅读:
    去掉ASP.NET Development Server 中的虚拟路径
    实战 SQL Server 2008 数据库误删除数据的恢复
    人的一生,到底在追求什么?
    每日一记20211215
    CentOS系统配置本地yum源
    mysql修改和查看时区
    依赖报错问题
    没想到MarkText竟然是一款比Typora更简洁优雅的markdown编辑器,完全开源免费!
    免费javascript富文本编辑器 总有一款会适合你!
    90%的人都不知道网页文字被禁止如何复制,教你几招神奇技能就可以免费解决,一定要看完!
  • 原文地址:https://www.cnblogs.com/A-sc/p/12841509.html
Copyright © 2011-2022 走看看