给出2个N * N的矩阵M1和M2,输出2个矩阵相乘后的结果。
Input第1行:1个数N,表示矩阵的大小(2 <= N <= 100)
第2 - N + 1行,每行N个数,对应M1的1行(0 <= M1ii <= 1000)
第N + 2 - 2N + 1行,每行N个数,对应M2的1行(0 <= M2ii <= 1000)Output输出共N行,每行N个数,对应M1 * M2的结果的一行。Sample Input
2
1 0
0 1
0 1
1 0
Sample Output
0 1
1 0
离散里面学到了Warshall算法
也不管简便不简便就直接用了
不过这个算法是用来算传递闭包的,稍微改造了下
列如:
0 0 1 0 0 1
1 0 0 1 0 1
0 1 0 0 1 1 相乘
则先检索第一个数组里的第一竖列 即arr1[i][1] i递增 看此位置是否是1
先假设arr【1】【1】为第一行,,第一列
此图中 i为2时arr1[2][1]为1,即(2,1),
根据传递性,在第二个数组中寻找( 1,x)位置为1的元素
即x=3 ,arr2[1][3]为1,(2,1)(1,3)则传递为(2,3)
于是将arr3空数组中位置为2,3的元素置1,然后再检索第二竖列
,以此类推
0 0 1 0 0 1
1 0 0 1 0 1
0 1 0 0 1 1
(3,2)->(2,1),(2,3)传递成(3,1)(3,3),将arr3[][]对应位置置1。。。。。
此代码将检索1改为检索是否为0
将arr3【】【】中传递的来的元素累加成传递前两个数的乘积
#include <iostream>
#include <cstdio>
int arr1 [1010][1010];
int arr2 [1010][1010];
int arr3 [1010][1010];
int main() {
int n,a;
scanf("%d",&n);
for(int i=1;i<=n;i++) //传值
for(int x=1;x<=n;x++)
{
scanf("%d",&a);
arr1[i][x]=a;
}
for(int i=1;i<=n;i++)
for(int x=1;x<=n;x++)
{
scanf("%d",&a);
arr2[i][x]=a;
}
for(int i=1;i<=n;i++)
for(int x=1;x<=n;x++)//第x行,i列,先检索行
{
if(arr1[x][i]!=0)//找到不为0的数arr【x】【i】
{
for(int z=1;z<=n;z++) //寻找arr【i】【】
{
if(arr2[i][z]!=0) //找到arr【i】【z】
{
arr3[x][z]+=arr1[x][i]*arr2[i][z];//累加
}
}
}
}
for(int i=1;i<=n;i++) //输出
{
for(int x=1;x<=n;x++)
{
if(x!=n)
printf("%d ",arr3[i][x]);
else
printf("%d",arr3[i][x]);
}
printf("\n");
}
return 0;
}
本文介绍了一种使用Warshall算法思想实现的矩阵乘法方法,并提供了详细的步骤解析及C++实现代码。

758

被折叠的 条评论
为什么被折叠?



