Codeforce957B(暴力模拟)

Mystical Mosaic

There is a rectangular grid of n rows of m initially-white cells each.
Arkady performed a certain number (possibly zero) of operations on it. In the i-th operation, a non-empty subset of rows Ri and a non-empty subset of columns Ci are chosen. For each row r in Ri and each column c in Ci, the intersection of row r and column c is coloured black.
There’s another constraint: a row or a column can only be chosen at most once among all operations. In other words, it means that no pair of (i, j) (i < j) exists such that or , where denotes intersection of sets, and denotes the empty set.
You are to determine whether a valid sequence of operations exists that produces a given final grid.tp://codeforces.com/contest/957/problem/B)

题意:给你一个n*m矩阵,有一种操作—在矩阵中选出一些行与列(每一行,每一列只能选一次),要求这些行与列相交的点为‘#’,并且操作之后‘#’变为‘.’,可以进行多次操作,问是否能在多次操作后使得矩阵没有‘#’。
思路:直接暴力模拟操作,对每行每列标记,判断是否符合条件。
#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <cmath>
#include <algorithm>
#include <functional>
#define inf 1000000000
using namespace std;
typedef long long ll;
const int MAXN=1e9+10;
const int MAX=1e3+10;
const double eps=1e-6;

int n,m;
char G[100][100];
int r[100],c[100];

int main(){
    #ifdef ONLINE_JUDGE
    #else
    freopen("in.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    #endif

    cin>>n>>m;
    for(int i=0;i<n;i++)
        scanf("%s",G[i]);
    int juge=1;
    int cnt=1;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(G[i][j]=='#'){
                if(!r[i]&&!c[j]){
                    r[i]=c[j]=cnt++;
                }
                else if(!r[i]||!c[j]){
                    r[i]=c[j]=max(r[i],c[j]);
                }
                else if(r[i]&&c[j]&&r[i]!=c[j])
                    juge=0;
            }
        }
        if(!juge)   break;
    }
    for(int i =0;i<n;i++){
        for(int j=0;j<m;j++){
            if(G[i][j]=='.'&&r[i]==c[j]&&r[i]!=0){
                //cout<<i<<" "<<j<<endl;
                juge=0;
                break;
            }
        }
    }

    if(juge)    cout<<"Yes"<<endl;
    else cout<<"No"<<endl;


    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值