将M*N矩阵中0元素所在的行、列的元素全部置为0
解决这个问题可以有两种办法:
1:借助于O(M*N)空间,对矩阵元素逐行或逐列修改
2:借助于O(M+N)空间,对矩阵元素逐个检查是否要置为0
1:第一种方法
//将M*N矩阵中0元素所在的行、列的元素全部置为0
#include <stdio.h>
#define M 3
#define N 4
int main()
{
int a[M][N]={{1,2,0,4},{1,3,1,5},{1,0,3,8}};
int i,j,k,b[M][N];
//输出之前的矩阵
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%d ",a[i][j]);
printf("\n");
}
//将原矩阵中0元素所在位置在新矩阵中做标记
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
if(a[i][j])
b[i][j]=1;
else
b[i][j]=0;
}
//将原矩阵中0元素所在的行列全部置为0
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
if(b[i][j]==0)
{
for(k=0;k<N;k++)
a[i][k]=0;
for(k=0;k<M;k++)
a[k][j]=0;
}
}
//输出处理后的矩阵
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}
原矩阵:
1 2 0 4
1 3 1 5
1 0 3 8
之后的矩阵:
0 0 0 0
1 0 0 5
0 0 0 0
2:第二种方法
//将M*N矩阵中0元素所在的行、列的元素全部置为0
#include <stdio.h>
#define M 3
#define N 4
int main()
{
int a[M][N]={{1,2,0,4},{1,3,1,5},{1,0,3,8}};
int i,j,b[M],c[N];
//输出之前的矩阵
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%d ",a[i][j]);
printf("\n");
}
//将原矩阵中0元素所在行列号在新数组中做标记,b标记行,c标记列
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(a[i][j]==0)
{
b[i]=1;
c[j]=1;
}
//根据b,c数组标记决定是否修改原矩阵中的元素为0
for(i=0;i<M;i++)
for(j=0;j<N;j++)
if(b[i]==1||c[j]==1)
a[i][j]=0;
//输出处理后的矩阵
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
printf("%d ",a[i][j]);
printf("\n");
}
return 0;
}