poj3213(特殊的矩阵乘法)

来源:互联网 发布:身份证恶搞软件 编辑:程序博客网 时间:2024/06/14 20:41

链接:点击打开链接

题意:给出N*P的矩阵a,P*M的矩阵b,N*M的矩阵c,c=a*b,但是c中可能有一个元素出现错误,找出错误的位置

代码:

#include <bitset>#include <vector>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;int r1[1005],r2[1005];int a[1005][1005],b[1005][1005],c[1005][1005];int main(){                                     //对于矩阵乘法来说,复杂度大部分是N^3但是    int i,j,k,n,m,p,id,tmp;                     //当一个矩阵只有一维时,则复杂度变为N^2,    while(scanf("%d%d%d",&n,&p,&m)!=EOF){       //所以对于这道题,我们可以想到两边左乘一个        for(i=1;i<=n;i++)                       //一维所有元素全是1的矩阵,再判断是否想相同        for(j=1;j<=p;j++)        scanf("%d",&a[i][j]);        for(i=1;i<=p;i++)        for(j=1;j<=m;j++)        scanf("%d",&b[i][j]);        for(i=1;i<=n;i++)        for(j=1;j<=m;j++)        scanf("%d",&c[i][j]);        memset(r1,0,sizeof(r1));        memset(r2,0,sizeof(r2));        for(i=1;i<=p;i++){                      //就相当于第一个矩阵每列相加形成行矩阵后,再            for(j=1;j<=n;j++)                   //乘第二个矩阵            r1[i]+=a[j][i];        }        for(i=1;i<=m;i++){            for(j=1;j<=p;j++)            r2[i]+=r1[j]*b[j][i];        }        memset(r1,0,sizeof(r1));        for(i=1;i<=m;i++){            for(j=1;j<=n;j++)            r1[i]+=c[j][i];        }        id=-1;        for(j=1;j<=m;j++){                      //通过左右乘完后的一维矩阵判断哪列可能出现错误            if(r1[j]!=r2[j]){                id=j;                break;            }        }        if(id==-1)        puts("Yes");        else{            for(i=1;i<=n;i++){                  //直接在列上寻找                tmp=0;                for(j=1;j<=p;j++)                tmp+=a[i][j]*b[j][id];                if(tmp!=c[i][id]){                    puts("No");                    printf("%d %d\n",i,id);                    printf("%d\n",tmp);                }            }        }    }    return 0;}

0 0