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;
}