加读入优化,或者等式两边乘以一个列向量,验证是否成立。
#include<bits/stdc++.h>
using namespace std;
void read(int&a){
char ch;while(!((ch=getchar())>='0')&&(ch<='9'));
a=ch-'0';while(((ch=getchar())>='0')&&(ch<='9'))a*=10,a+=ch-'0';
}
const int MAXN=550;
int a[MAXN][MAXN],b[MAXN][MAXN],c[MAXN][MAXN],d[MAXN][MAXN];
int main()
{
int n,i,j,k,flag;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
read(a[i][j]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
read(b[i][j]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
read(c[i][j]);
memset(d,0,sizeof(d));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
for(k=1;k<=n;k++)
d[i][j]+=a[i][k]*b[k][j];
flag=1;
for(i=1;i<=n&&flag;i++)
for(j=1;j<=n&&flag;j++)
if(c[i][j]!=d[i][j])
flag=0;
if(flag)
printf("Yes\n");
else
printf("No\n");
}
}