1. 程式人生 > >【ShawnZhang】帶你看藍橋杯——演算法訓練 矩陣乘法

【ShawnZhang】帶你看藍橋杯——演算法訓練 矩陣乘法

【ShancoLove】帶你看藍橋杯——演算法訓練 矩陣乘法  

問題描述   輸入兩個矩陣,分別是m*s,s*n大小。輸出兩個矩陣相乘的結果。 輸入格式   第一行,空格隔開的三個正整數m,s,n(均不超過200)。
  接下來m行,每行s個空格隔開的整數,表示矩陣A(i,j)。
  接下來s行,每行n個空格隔開的整數,表示矩陣B(i,j)。 輸出格式   m行,每行n個空格隔開的整數,輸出相乘後的矩陣C(i,j)的值。 樣例輸入 2 3 2
1 0 -1
1 1 -3
0 3
1 2
3 1 樣例輸出 -3 2
-8 2

提示
矩陣C應該是m行n列,其中C(i,j)等於矩陣A第i行行向量與矩陣B第j列列向量的內積。
例如樣例中C(1,1)=(1,0,-1)*(0,1,3) = 1 * 0 +0*1+(-1)*3=-3

解題思路:輸入陣列計算都不是問題主要問題要弄清楚,矩陣的乘法之間如何通過演算法來表示出來

那就是三層迴圈,下方已用方框框出,已示重要,通過三層迴圈的巢狀,行乘以列的值,用p[i][k]*q[k][j]來完成矩陣的乘法。其餘就沒有什麼複雜的地方了。

import java.util.Scanner;
public class Main{
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		int m=in.nextInt();
		int s=in.nextInt();
		int n=in.nextInt();
		int[][] p=new int[m][s];
		int[][] q=new int[s][n];
		for(int i=0;i<m;i++){
			for(int j=0;j<s;j++)
				p[i][j]=in.nextInt();
		}
		for(int i=0;i<s;i++){
			for(int j=0;j<n;j++)
				q[i][j]=in.nextInt();
		}
		int[][] r=new int[m][n];
		for(int i=0;i<m;i++){
			for(int j=0;j<n;j++){
				for(int k=0;k<s;k++) {
					/****************************************/
					/**/r[i][j] += p[i][k]*q[k][j];/*********/
					/****************************************/
				}
			}
		}
		for(int i=0 ; i<m ; i++) {
			for(int j=0 ; j<n ; j++) {
				System.out.print(r[i][j] + " ");
			}
		}
	}
}