CF486B OR in Matrix

题目

CF486B OR in Matrix

分析

首先可以发现,如果有 (B[i][j]=0) 那么必然有 (A)(i) 行和 (j) 列都是 (0)

于是我们可以考虑把这些必须为 (0) 的点全部换成 (0) ,剩下的能放 (1) 就放 (1) 然后检验是否还是满足限制即可。

代码

#include<bits/stdc++.h>
using namespace std;
template<typename T>
inline void read(T &x){
	x=0;bool f=false;char ch=getchar();
	while(!isdigit(ch)){f|=ch=='-';ch=getchar();}
	while(isdigit(ch)){x=x*10+(ch^48);ch=getchar();}
	x=f?-x:x;
	return ;
}
template<typename T>
inline void write(T x){
	if(x<0) x=-x,putchar('-');
	if(x>9) write(x/10);
	putchar(x%10^48);
	return ;
}
const int N=105;
#define PII pair<int,int>
#define pb push_back
#define fi first
#define se second
#define mp make_pair
#define ll long long
int n,m;
int a[N][N],cnt;
PII t[N*N];
signed main(){
	read(n),read(m);
	for(register int i=1;i<=n;i++) for(register int j=1;j<=m;j++) a[i][j]=1;
	for(register int i=1;i<=n;i++){
		for(register int j=1,x;j<=m;j++){
			read(x);
			if(x==1){
				t[++cnt].fi=i,t[cnt].se=j;
				continue;
			}
			for(register int k=1;k<=n;k++) a[k][j]=0;
			for(register int k=1;k<=m;k++) a[i][k]=0;
		}
	}
	for(register int i=1;i<=cnt;i++){
		int tmp=0;
		for(register int k=1;k<=n;k++) tmp|=a[k][t[i].se];
		for(register int k=1;k<=m;k++) tmp|=a[t[i].fi][k];
		if(!tmp) return puts("NO"),0;
	}
	puts("YES");
	for(register int i=1;i<=n;i++){
		for(register int j=1;j<=m;j++) write(a[i][j]),putchar(' ');
		putchar('
');
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Akmaey/p/15266117.html