A、B为01矩阵,先输入B矩阵
生成A矩阵条件为:若B[i][j]=0,则A[i][j]所在行与所在列所有元素的和为0;若B[i][j]=1,则A[i][j]所在行与所在列所有元素的和不能为0。
思路:构造A矩阵全为1,先输入B矩阵,对B矩阵进行遍历,
条件1:当B[i][j]为0时,则将A[i][j]所在行与列的所有元素设为0。
条件2:当B[i][j]为1时,则将A[i][j]所在行与列的所有元素进行相加,若和为0则输出no。
当两个条件都符合时,则输出矩阵
代码:
#include <iostream>
#include <cstring>
using namespace std;
//https://www.acwing.com/problem/content/4807/
int a[110][110],b[110][110];
int main(){
/*先构造a矩阵,
当输入的B[i][j]=0时,将十字全为0
当输入的B[i][j]=1时,检查十字不能全为0
*/
int m,n,sum;
cin>>m>>n;
for (int i = 1; i <= 110; i ++ )
for (int j = 1; j <= 110; j ++ )
a[i][j] = 1;
//条件1
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>b[i][j];
if(b[i][j]==0){
for(int k=1;k<=n;k++)
a[i][k]=0;
for(int k=1;k<=m;k++)
a[k][j]=0;
}
}
}
//条件2
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(b[i][j]==1){
sum=0;
//去判定矩阵a不能全为0
for(int k=1;k<=n;k++)
sum+=a[i][k];
for(int k=1;k<=m;k++)
sum+=a[k][j];
if(sum==0){
cout<<"NO";
return 0;
}
}
}
}
cout << "YES" << endl;
for (int i = 1; i <= m; i ++ ) {
for (int j = 1; j <= n; j ++ )
cout << a[i][j] << " ";
cout << endl;
}
return 0;
}