机试矩阵专题
本篇文章给出矩阵常规操作的代码,有乘法、快速幂、翻转等。
- 乘法
计算result[10][10] * a[10][10],结果保存在result数组中。
void Pow(int result[10][10], int a[10][10], int n){
int temp[10][10];
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++){
temp[i][j] = 0;
}
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++){
temp[i][j] += result[i][k]*a[k][j];
}
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++){
result[i][j] = temp[i][j];
}
}
重点就是这个三层循环(乘法):c[i][j] += a[i][k] * b[k][j];
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++){
temp[i][j] += result[i][k]*a[k][j];
}
- 矩阵快速幂
此题在北邮oj上,用矩阵幂或矩阵快速幂的代码都能AC,效率也并不是差别很大,可能是测试数据比较小的缘故,但温习一下快速幂的思想还是好的
AC代码如下(快速幂版本):
#include<bits/stdc++.h>
using namespace std;
void Pow(int result[10][10], int a[10][10], int n){
int temp[10][10];
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++){
temp[i][j] = 0;
}
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
for(int k = 0; k < n; k++){
temp[i][j] += result[i][k]*a[k][j];
}
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++){
result[i][j] = temp[i][j];
}
}
int main(){
int t, n, k, c[10][10], result[10][10], temp;
scanf("%d", &t);
while(t--){
scanf("%d%d", &n, &k); //a是 a x a矩阵,b是b次幂
for(int i = 0; i < n; i++) //矩阵输入
for(int j = 0; j < n; j++){
scanf("%d", &temp);
c[i][j] = temp;
}
for(int i = 0; i < n; i++) //result矩阵赋值为单位矩阵
for(int j = 0; j < n; j++){
if(i == j){
result[i][j] = 1;
}else{
result[i][j] = 0;
}
}
while(k != 0){
if(k %2 == 1){
Pow(result,c,n);
}
Pow(c,c,n);
k /= 2;
}
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
{
printf("%d", result[i][j]);
if(j != n-1){
printf(" ");
}else{
printf("\n");
}
}
}
return 0;
}