本题就是先求出A数列,然后求出对应的正确的B,再与所给的实际的B一一对比,如果全都相同则YES,否则错误。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 105;
int row[N],col[N];
bool visr[N],visc[N],vis[N][N];
int a[N][N],d[N][N];
int main() {
int n,m;
while(scanf("%d%d",&m,&n)!=EOF) {
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
scanf("%d",&a[i][j]);
}
}
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(a[i][j]==0) {
row[i]=1;
col[j]=1;
}
}
}
int flag=0;
memset(visr,0,sizeof(visr));
memset(visc,0,sizeof(visc));
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(!row[i]&&!col[j]) {
vis[i][j]=1;
visr[i]=1;
visc[j]=1;
}
}
}
memset(d,0,sizeof(d));
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(visr[i]||visc[j]) {
d[i][j]=1;
}
if(a[i][j]!=d[i][j]) {
flag=1;
}
}
}
if(flag) {
printf("NO\n");
continue;
} else {
printf("YES\n");
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(j==n-1)
printf("%d\n",vis[i][j]);
else
printf("%d ",vis[i][j]);
}
}
}
}
return 0;
}