文章目录
- C翻转
- 矩阵幂
一、C翻转IO链接
**本题思路:**本题需要找出顺时针旋转和逆时针旋转的规律,然后就可以解决该问题。
矩阵顺时针90°旋转规律:列号变为行号,(n-行号-+1)变为列号 规律:a[i][j]=b[j][n-i+1];
矩阵逆时针90°旋转规律:行号变为列号,(n-行号+1)变为行号,规律:a[i][j]=b[n-j+1][i];
cpp
#include <bits/stdc++.h>
constexpr int N=8;
int g[N][N];
int tmp[N][N];//用来存储旋转后的数组元素
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);std::cout.tie(nullptr);
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
std::cin>>g[i][j];
int op,n;//op代表是往哪个方向进行旋转,n表示旋转的个数
int x,y;
std::cin>>op>>n>>x>>y;
//顺时针
if(op==1){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)//列号变为行号,(n-行号-+1)变为列号 规律:a[i][j]=b[j][n-i+1];
tmp[j][i]=g[x-1+n-1-i][y-1+j];
}
//逆时针
else if(op==2){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)//行号变为列号,(n-行号+1)变为行号,规律:a[i][j]=b[n-j+1][i];
tmp[n-1-j][i]=g[x-1+i][y-1+j];
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
g[i+x-1][j+y-1]=tmp[i][j];
for(int i=0;i<5;i++){
for(int j=0;j<5;j++)
std::cout<<g[i][j]<<" ";
std::cout<<std::endl;
}
return 0;
}
二、矩阵幂IO链接
**本题思路:**本题是矩阵乘法的模板题,矩阵乘法中第一个矩阵的列要等于第二个矩阵的行
一个m∗n的的A矩阵,和一个n∗p的B矩阵相乘,将得到一个m∗p的矩阵C 。
cpp
#include <bits/stdc++.h>
constexpr int N=15;
int n,k;
int g[N][N],p[N][N];
int tmp[N][N];
void mul()
{
memset(tmp,0,sizeof tmp);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
int sum=0;
for(int k=1;k<=n;k++)//矩阵的乘法:第一个矩阵的列需要与第二个矩阵的行相乘
sum+=g[i][k]*p[k][j];
tmp[i][j]=sum;
}
memcpy(g,tmp,sizeof(tmp));
}
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);std::cout.tie(nullptr);
std::cin>>n>>k;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
std::cin>>g[i][j];
memcpy(p,g,sizeof(g));
for(int j=1;j<k;j++) mul();
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
std::cout<<g[i][j]<<" ";
std::cout<<std::endl;
}
return 0;
}