转载请注明出处: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; }