九度OJ_1001:计算A+B矩阵和中全零行列总数

首先,肯定需要两个二维数组a[10][10],b[10][10]

我首先想到要将数组初始化了,后来在扫描结束了给数组其他部分赋初值,还想被赋值的不能是0,╮(╯▽╰)╭全想偏了,因为后面在判断行、列是否全为零的时候并不会取到后面的初值。


接着是怎样判断和中一个行(数组)是否全为零。

1.计算出两矩阵的和矩阵,判断该矩阵中行列全0的数目(2)

何时计算?

1.1扫描获得两个矩阵(二维数组)之后,再扫描一遍A、B矩阵,计算出和矩阵

1.2扫描获取第二个矩阵(二维数组)的同时计算出和矩阵

(1.1到1.2 时间上的优化)

2.不计算和矩阵,用一个s计算A、B矩阵对应位置的和,flag做标兵,一旦s不为零即该行(或列)不是全为零

(1到2 空间上的优化)

上面最终都是一个一个判断行或列中元素是否全部为0.

#include<stdio.h>

int main()
{
	int m,n;
	int a[10][10];
	int b[10][10];
	int i=0,j=0,s=0,num=0;
	int flag=0;
	while(1)
	{
		scanf("%d",&m);
		if(m!=0)
		{
		scanf("%d",&n);
		//先初始化a,b数组
		/*
		for(i=0;i<10;i++)
			for(j=0;j<10;j++)
				a[i][j]=-1;
		*/

		for(i=0;i<m;i++)
			for(j=0;j<n;j++)
					scanf("%d",&a[i][j]);

		for(i=0;i<m;i++)
			for(j=0;j<n;j++)
					scanf("%d",&b[i][j]);


		num=0;

		//判断几行为0  相当于判断一个数组是否全为零  貌似有好的方法的
		for(i=0;i<m;i++)
		{
			flag=0;
			for(j=0;(j<n)&&(flag==0);j++)
			{
				s=a[i][j]+b[i][j];
				if(s!=0)
					flag=1;
			}
			if(flag==0)
				num++;
		}

		s=0;
		//判断几列为0
		for(j=0;j<n;j++)
		{
			flag=0;
			for(i=0;(i<m)&&(flag==0);i++)//数组这样取用时会比较多  矩阵转置的做法?
			{
				s=a[i][j]+b[i][j];
				if(s!=0)
					flag=1;
			}
			if(flag==0)
				num++;
		}

		printf("%d\n",num);
		}

		else
			break;
	}
	return 0;
}

下面是别人的代码,C++写的

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
using namespace std;
 
//[0][0] [0][1]
//http://ac.jobdu.com/problem.php?pid=1001
//a+b matrices
int t_1001()
{
    int matr[11][11];
    int n=0,m=0;
    int i=0,j=0;
    int k=0,l=0;
    int tmp=0,flag_r;
    int ary[11];
 
    while(!feof(stdin))
    {
        m=0;    //行数
        n=0;    //列数
        scanf("%d",&m);
        if(m == 0)
            break;
        scanf("%d",&n);
        k=m,l=0;
        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&matr[i][j]);
            }
        }
        flag_r=0;
        for(i=0;i<11;i++)
        {
            ary[i]=1;
        }
        for(i=0;i<m;i++)
        {
            flag_r=0;
            for(j=0;j<n;j++)
            {
                scanf("%d",&tmp);
                if((matr[i][j]+=tmp) !=0)
                {
                    flag_r=1;
                    ary[j]=0;
                }
                if( i == (m-1) )
                {
 
                    l+=ary[j];
                }
            }
            k-=flag_r;
        }
       // printf(" k=%d l=%d %d\n",k,l,k+l);
       printf("%d\n",k+l);
    }
    return 0;
}
int main()
{
    //cout << "t_1000!" << endl;
    t_1001();
    //cout << "t_1000,run end!" << endl;
    //cout << "Hello world!" << endl;
    return 0;
}


但是想说,这里面其实有很多不太好的地方,比如:

1.判断几列全0的时候,取数组元素就比判断行为0的要慢。

2.其实s[i][j]不等于零,就能同时排除i行和j列了。

3.感觉之前好像有说面试题里,有问怎样快速判断数组是否全0,但是我去网上搜也没搜到呢疑问


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值