转载请注明出处:http://blog.csdn.net/ns_code/article/details/21480757
题目:
Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0.
翻译:
写一个算法,对于一个MxN的矩阵,如果矩阵中某个元素为0,则将它所在的行和列都置为0.
思路:
肯定要遍历该矩阵,但显然我们不能遇到为0的元素就直接把它所在的行和列的元素置为0,这样遍历到后面的0时就不知道该位置本来就是0还是后来被置为0的。我们可以在遇到0时,将其坐在行和列的元素置为一个数组中不存在的值,而后在第二次遍历的时候遇到该数值,就把它变为0,但这样的数值的选取不具有普遍性。
我们可以这样做,开辟两个bool数组row[M]和col[N],各元素初始值均为false,当遍历矩阵A[M][N]时,遇到A[i][j]为0,则将row[i]和col[j]置为true,而后第二次遍历该矩阵时,遇到row[i]或col[j]为true的,就将第i行或第j列的元素置为0.
实现代码:
/*******************************************************
题目描述:
如果以m*n矩阵中某个元素为0,则将它所在的行和列都置为0
Date:2014-03-18
********************************************************/
#include<stdio.h>
#include<string.h>
/*
由于我的编译器不支持C99,这里只能将数组row[m]和col[n]作为参数传入
*/
void zeroMatrix(int (*A)[4],int *row,int *col,int m,int n)
{
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(A[i][j] == 0)
{
row[i] = true;
col[j] = true;
}
for(i=0;i<m;i++)
for(j=0;j<n;j++)
if(row[i] || col[j])
A[i][j] = 0;
}
int main()
{
int A[3][4] =
{
{1,4,6,9},
{2,0,5,3},
{3,6,3,0},
};
int row[3];
int col[4];
memset(row,0,sizeof(row));
memset(col,0,sizeof(col));
int i,j;
printf("the orginal matrix:\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%d ",A[i][j]);
printf("\n");
}
zeroMatrix(A,row,col,3,4);
printf("now the the matrix:\n");
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
printf("%d ",A[i][j]);
printf("\n");
}
return 0;
}
测试结果: