转换成一维矩阵的形式 O(n^2)
代码:
#include<stdio.h>
#include<string.h>
#define maxn 505
int n;
int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];
int abd[maxn],bd[maxn],cd[maxn],d[maxn];
void init(int m[][maxn])
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&m[i][j]);
}
int main()
{
//freopen("Input.txt","r",stdin);
int i,j;
while(~scanf("%d",&n))
{
init(a);init(b);init(c);
for(i=1;i<=n;i++)
d[i]=i;
memset(bd,0,sizeof(bd));
memset(cd,0,sizeof(cd));
memset(abd,0,sizeof(abd));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
bd[i]+=b[i][j]*d[j];
cd[i]+=c[i][j]*d[j];
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
abd[i]+=a[i][j]*bd[j];
int flag=0;
for(i=1;i<=n;i++)
if(abd[i]!=cd[i])
{
flag=1;break;
}
if(flag==1) printf("NO\n");
else printf("YES\n");
}
return 0;
}
如果对输入函数进行处理,时间会省掉1s;
代码:
#include<stdio.h>
#include<string.h>
#define maxn 505
int n;
int a[maxn][maxn],b[maxn][maxn],c[maxn][maxn];
int abd[maxn],bd[maxn],cd[maxn],d[maxn];
void in(int &m)
{
char ch;
int flag=0;
while((ch=getchar())<'0'||ch>'9')
if(ch=='-') flag=1;
for(m=0;ch>='0'&&ch<='9';ch=getchar())
m=m*10+ch-'0';
if(flag) m*=-1;
}
void init(int m[][maxn])
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
in(m[i][j]);
}
int main()
{
//freopen("Input.txt","r",stdin);
int i,j;
while(~scanf("%d",&n))
{
init(a);init(b);init(c);
for(i=1;i<=n;i++)
d[i]=i;
memset(bd,0,sizeof(bd));
memset(cd,0,sizeof(cd));
memset(abd,0,sizeof(abd));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
bd[i]+=b[i][j]*d[j];
cd[i]+=c[i][j]*d[j];
}
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
abd[i]+=a[i][j]*bd[j];
int flag=0;
for(i=1;i<=n;i++)
if(abd[i]!=cd[i])
{
flag=1;break;
}
if(flag==1) printf("NO\n");
else printf("YES\n");
}
return 0;
}