题目
分析
首先可以发现,如果有 (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;
}