矩陣乘法(藍橋杯)

/*
這個題目博主還是思考和調試了不少時間,因爲一直想讓自己的算法儘量少花時間(注意!!!矩陣元素非負時,矩陣的0次冪是單位矩陣!!!)。下面扔出C++代碼,和右邊界運行結果和時間(博主注意到,在N=30,M=5,且矩陣元素均爲10時,long long也是不夠用的,所以所給的截圖是把M改成了4的結果)。
PS:雖然右邊界會越界,但提交上去依舊AC了,因爲測試數據並沒有給那麼大,如果某dalao有好的建議,望不吝賜教!
*/
/*問題描述
  給定一個N階矩陣A,輸出A的M次冪(M是非負整數)
  例如:
  A =
  1 2
  3 4
  A的2次冪
  7 10
  15 22
輸入格式
  第一行是一個正整數N、M(1<=N<=30, 0<=M<=5),表示矩陣A的階數和要求的冪數
  接下來N行,每行N個絕對值不超過10的非負整數,描述矩陣A的值
輸出格式
  輸出共N行,每行N個整數,表示A的M次冪所對應的矩陣。相鄰的數之間用一個空格隔開
樣例輸入
2 2
1 2
3 4
樣例輸出
7 10
15 22
*/

#include <iostream>
#include <algorithm>
#include <ctime> 
using namespace std;
clock_t start,end;
int main()
{
	long long int A[30][30],S[30][30],T[30][30],N,M;//S放最終結果。A放初始矩陣。T放中間計算過程矩陣 
	cin>>N>>M;
	for(int i=0;i<N;i++)
		for(int j=0;j<N;j++){
			cin>>A[i][j];
			S[i][j]=A[i][j];
			T[i][j]=A[i][j];
		}
	start=clock();//計時 
	do{
		if(M==0){
			for(int i=0;i<N;i++)
				for(int j=0;j<N;j++){
					S[i][j]=0;
					if(i==j) S[i][j]=1;
				} //當要求矩陣的0次冪,結果爲單位陣	
			break;
		}	
		if(M==1) break;
		else{
			for(int i=0;i<N;i++){
				for(int j=0;j<N;j++){
					int temp=0;
					for(int k=0;k<N;k++){
						temp+=(T[i][k]*A[k][j]);
					}
					S[i][j]=temp;
				}
			}
			for(int i=0;i<N;i++)
				for(int j=0;j<N;j++)
					T[i][j]=S[i][j];
			M--;
		}
	}while(M>1);
	end=clock();//在打印之前結束計時 
	for(int i=0;i<N;i++){
		for(int j=0;j<N;j++){
			cout<<S[i][j]<<" ";
		}
		cout<<endl;
	}
	cout<<end-start<<" ms"<<endl;
	return 0;
}

Lin

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章