解题思路:
考虑先根据 b b b 的必要条件构造出一组可能的解然后再根据这一个构造出的判断是否可行。
由于每一个 b b b 中一旦有 0 0 0,那么 a a a 中所有的与这个元素同行或者同列的元素都必须为 0 0 0,否则一旦出现 1 1 1 就一定不可能在这个位置出现 0。
根据这个性质,不妨先将 a a a 数组全都变为 1 1 1,一旦遇到上述情况就将 a a a 中与之同行、列的所有元素变为 0 0 0。
但这样随之带来一个问题,就是可能出现变为 0 0 0 的元素过多导致 b b b 某一些应该出现 1 1 1 的位置变为了 0 0 0,所以需要重新根据这个 a a a 构造出 b b b 然后和应该出现的进行判断。
友情提示:这道题循环比较多,注意一下是否有打错变量的情况。
代码:
#include<cstdio>
using namespace std;
int a[105][105],b[105][105],n,m,c[105][105];
bool check(){
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(b[i][j]!=c[i][j])
return 0;
return 1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
a[i][j]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
scanf("%d",&b[i][j]);
if(b[i][j]==0){
for(int ii=1;ii<=n;ii++)
a[ii][j]=0;
for(int jj=1;jj<=m;jj++)
a[i][jj]=0;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
for(int ii=1;ii<=n;ii++)
c[i][j]|=a[ii][j];
for(int jj=1;jj<=m;jj++)
c[i][j]|=a[i][jj];
}
if(check()==0){
printf("NO\n");
return 0;
}
printf("YES\n");
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}