【CareerCup】 Arrays and Strings—Q1.6

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

    测试结果:




  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值