【蓝桥杯】基础练习 矩阵乘法

问题描述
  给定一个 N N N阶矩阵 A A A,输出 A A A M M M次幂( M M M是非负整数)
  例如:
   A A A =
  1 2
  3 4
   A A A的2次幂
  7 10
  15 22
输入格式
  第一行是一个正整数 N N N M M M(1<= N N N<=30, 0<= M M M<=5),表示矩阵 A A A的阶数和要求的幂数
  接下来 N N N行,每行 N N N个绝对值不超过10的非负整数,描述矩阵 A A A的值
输出格式
  输出共 N N N行,每行 N N N个整数,表示 A A A M M M次幂所对应的矩阵。相邻的数之间用一个空格隔开
样例输入
2 2
1 2
3 4
样例输出
7 10
15 22

【内心 o s os os:看到这个题目,就想起大佬常说的矩阵快速幂,但,,奈何不会呀!只能老老实实用线代中的只是解决了(其实还是偷学了一点点应用到代码中)】

个人思路:用一个结构体存储二维数组,即矩阵,然后就直接矩阵乘法了,感觉还是挺简单的;需要注意一下对于幂数的判断, m = 0 m = 0 m=0 m = 1 m = 1 m=1这两种特殊情况要单独处理

#include 
#include 
#include  
#include 
using namespace std;
int n,m;
struct node {
	int a[35][35];
	node () {
		memset(a, 0, sizeof(a));
	}
};
node A,res;
//矩阵乘法
node mul(node ans, node ant) {
	node t;
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < n; ++j) {
			for (int k = 0; k < n; ++k) {
				t.a[i][j] += ans.a[i][k] * ant.a[k][j];
			}
		}
	}
	return t;
}
//幂
node mul_m(node ans) {
	node h,t;
	t = ans;
	for (int i = 0; i < m - 1; ++i) {
		h = mul(t, ans);
		t = h;
	}
	return t;
}
int main() {
	cin >> n >> m;
	for (int i = 0; i < n; ++i) {
		for (int j = 0; j < n; ++j) {
			cin >> A.a[i][j];
		}
	}
	//原矩阵
	if (m == 1) {
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j < n; ++j) {
				cout << A.a[i][j] << " ";
			}
			cout << endl;
		}
	}
	//单位矩阵
	else if (m == 0) {
		for(int i=0;i<n;i++) {
			for(int j=0;j<n;j++){
				if(i==j)
					cout << 1 << " ";
				else
					cout << 0 << " ";
			}
			cout << endl;
		}
	}
	else {
		node result;
		result = mul_m(A);
		for (int i = 0; i < n; ++i) {
			for (int j = 0; j < n; ++j) {
				cout << result.a[i][j] << " ";
			}
			cout << endl;
		}
	}
	return 0;	
}

你可能感兴趣的:(【蓝桥杯】)